免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2523 | 回复: 1
打印 上一主题 下一主题

关于多线程/多进程的控制问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-19 10:34 |只看该作者 |倒序浏览
关于多线程/多进程的控制问题:
    我目前需要用python实现一个多个socket的连接server的客户端程序:
        单个流程如下:首先建立连接,在某一端口(如4104)进行注册,注册成功后,会开始与server进行通讯
        1.当server不发送指令给客户端时,每隔一段时间(如5秒钟)发送一个心跳包,告诉Server该客户端依旧在线
        2.当server发送要客户端发送文件的指令时,在接收到对应的指令后进行新的连接(如连接端口4103),并在此端口进行发送文件的操作,在此操作的持续时间内不需要发送心跳包。
        而要求同时实现多个该流程。目前遇到两个问题:
        1)如何实现每隔5秒钟发送一个心跳,并且在接到发送文件的指令后,不发送心跳,直至文件发送完成后,恢复此过程
        2)如何将单个流程线程化或是进程化
望有 精通python 多线程/多线程的高手指导一下,谢谢。

论坛徽章:
0
2 [报告]
发表于 2012-01-19 11:12 |只看该作者
ghostwwl 曾经发过一个精确控制子线程的代码,但是我没看懂,望高手指导,谢谢
代码引自 http://bbs.chinaunix.net/thread-3612044-1-1.html
#!/usr/bin/env python
#-*- coding: utf-8 -*-

#****************************************************
#  FileName: GThread.py
#  Author: ghostwwl
#  Note:
#    2008.10 add states and add Class_Timer
#****************************************************

import time
import threading
from timeit import default_timer

__author__ = "ghostwwl (ghostwwl@gmail.com)"
__version__ = "1.0"

#-------------------------------------------------------------------------------
class Thread_Control(object):
    '''The Control Class'''
    def __init__(self):
        self.ControlEvent = threading.Event()
        self.ControlEvent.set()
        self.TimeOut = None
        self.Terminated = False
        self.CStateInfo = {-1:'STOP', 0:'READY', 1:'RUNNING', 2:'PAUSE'}
        self.CSTATES = 0
   
    def stop(self):
        self.CSTATES = -1
        print 'WARNING %s] Stopping Thread %-30s [ OK ]' % (time.strftime("%Y-%m-%d %H:%M:%S"),
                                                             self.getName())
        self.Terminated = True
        
    def pause(self, TimeOut = None):
        self.TimeOut = TimeOut
        self.ControlEvent.clear()
        self.CSTATES = 2
        
    def restore(self):
        self.ControlEvent.set()

#-------------------------------------------------------------------------------
class mythread(threading.Thread, Thread_Control):
    '''
    BaseThread Class With Control Method[stop, pause, restore]
    time dilution of precision about 1 millisecond
    thread state {-1:'STOP', 0:'READY', 1:'RUNNING', 2:'PAUSE'}
    '''
   
    def __init__(self, owner, ThreadName, TimeSpacing=0, TimeDelay = 0):
        '''
        __init__(self, owner, ThreadName, TimeSpacing=0)
        owner         The Thread Owner
        ThreadName    The Thread Name
        TimeSpacing   Run TimeSpacing
        TimeDelay     The Thread Start TimeDelay
        '''
        self.owner = owner
        self.TimeSpacing = TimeSpacing #任务多长时间执行一次
        self.TimeDelay = TimeDelay
        Thread_Control.__init__(self)
        threading.Thread.__init__(self, name = ThreadName)
        self.setDaemon(1)
        
    def run(self):
        '''
        This While loop stop until Terminated
        This Object Has sotp, pause(timeout = None) and restore method
        '''
        if self.TimeDelay != 0:
            TSTART = self.TimeDelay
        else:
            TSTART = 0
        while 1:
            try:
                #这里是线程的停止处理
                if self.Terminated:
                    break
               
                #这里是线程的暂停处理
                if self.TimeOut is not None:
                    #带有暂停超时的处理
                    self.ControlEvent.wait(self.TimeOut)
                    self.TimeOut = None
                    self.ControlEvent.set()
                else:
                    #不带超时 那么必须等到线程恢复
                    self.ControlEvent.wait()
               
                CUR_TIMING = default_timer()
                if CUR_TIMING - TSTART > self.TimeSpacing:
                    TSTART = CUR_TIMING
                    #这个才是我们的工作函数
                    self.CSTATES = 1
                    self.handle()
                    
                time.sleep(0.001) #暂停1毫秒 防止空跑占用过高cpu
            except Exception, e:
                print "ERROR %s] %s Error: %s" % (time.strftime("%H:%M:%S"), self.getName(), str(e))
   
    def handle(self):
        '''The Real Work Function'''
        pass
   
    def getstate(self):
        '''check the thread state'''
        return self.CSTATES
   
    def getstatemsg(self):
        return self.CStateInfo[self.CSTATES]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP