- 论坛徽章:
- 0
|
本帖最后由 wfnh 于 2013-08-27 20:24 编辑
写了个timer类,发现每次都会多启动一个timer,一次比一次多,看得我十分不明白,求解答,代码和log在下面:
TaskManager:- #coding=gb2312
- #-------------------------------------------------------------------------------
- # Name: 模块1
- # Purpose:
- #
- # Author: Administrator
- #
- # Created: 02/03/2012
- # Copyright: (c) Administrator 2012
- # Licence: <your licence>
- #-------------------------------------------------------------------------------
- #!/usr/bin/env python
- import os
- import sys
- import time
- from event import eventDispatch
- #from common.singleton import Singleton #--单例模式
- from common import config
- from common.shareData import ShareData
- class TaskManager(object):
- #--该类为单例模式
- #__metaclass__ = Singleton
- def __init__(self,logger = None):
- self.logger = logger
- #self.logger.info('init TaskManager')
- self.evt_dispatch = eventDispatch.EventDispatch() #--事件分发
- #self.logger.info('evt_dispatch ok')
- self.share_data = ShareData() #--全局的共享数据
- #self.logger.info('share_data ok')
- for chan_name in config.CHANNAL_LIST: #--创建-全局数据频道
- self.share_data.add_channal(chan_name)
- #self.logger.info('channal ok')
- def loop(self):
- self.evt_dispatch.add_all()
- #self.logger.info('self.evt_dispatch.add_all()')
- self.evt_dispatch.dispatch()
- #self.logger.info('self.evt_dispatch.dispatch()')
- def stop(self):
- print('TaskManager stop')
- #self.logger.info("TaskManager stop")
- self.evt_dispatch.destroy()
- if __name__=='__main__':
- tm = TaskManager()
- tm.loop()
- time.sleep(20)
- print 'after 10s...'
- tm.stop()
复制代码 EventDispatch类:- #coding=gb2312
- #-------------------------------------------------------------------------------
- # Name: 模块1
- # Purpose:
- #
- # Author: Administrator
- #
- # Created: 02/03/2012
- # Copyright: (c) Administrator 2012
- # Licence: <your licence>
- #-------------------------------------------------------------------------------
- #!/usr/bin/env python
- import time
- import glob
- import os
- from common.util import import_all_module,get_logger
- from common.singleton import Singleton #--单例模式
- class EventDispatch(object):
- #--该类为单例模式
- __metaclass__ = Singleton
- event_queue = [] #--消息队列
- event_num = 0 #--队列中消息的数量
- tick_event_num = 0 #--队列中,等待触发的消息数量
- def __init__(self,evts = None):
- if isinstance(evts,list):
- self.event_queue = evts
- self.event_num = len(self.event_queue)
- self.running_event = []
- def add_event(self,evt):
- self.event_queue.append(evt)
- def add_all(self):
- import inspect
- #logger = get_logger('EventDispatch_add_all')
- #--获得当前文件和当前文件所在的目录
- this_file = inspect.getfile(inspect.currentframe())
- this_dir = os.path.abspath(os.path.dirname(this_file))
- path = os.path.join(this_dir,'customEvent')
- #logger.info(path)
- class_list = import_all_module(path,'event.customEvent','evt_*.py')
- #logger.info(class_list)
- if class_list:
- self.event_queue = class_list
- #logger.info('EventDispatch_add_all end')
- def dispatch(self,sleep_time = 5):
- time.sleep(sleep_time) #--默认5秒后,才开始触发事件
- logger = get_logger('dispatch_dispatch')
- for evt in self.event_queue:
- e = evt()
- self.running_event.append(e)
- #logger.info('before fire_event:%s'%(e))
- e.fire_event()
- logger.info('after fire_event:%s'%(e))
- logger.info('running_event num is %s,event_queue num is %s'%(len(self.running_event),len(self.event_queue)))
- def dispatch_ex(self,evt):
- self.event_queue.append(evt)
- e = evt()
- self.running_event.append(e)
- e.fire_event()
- def get_event(self,event_name):
- '''
- 获取一个事件对象,参数为事件名字
- '''
- for evt in self.running_event:
- if evt._EVENT_NAME == event_name:
- return evt
- def wake_up(self,event_name):
- '''
- 唤醒事件,参数为事件名字
- '''
- evt = self.get_event(event_name)
- if evt and evt.status == evt._SLEEPING:
- logger = get_logger('dispatch_wake_up')
- logger.info('dispatch instance is %s, evt is %s,wake_up:%s'%(self,evt,evt._EVENT_NAME))
- evt.switch(evt._WAKEUP)
- def destroy(self):
- for evt in self.running_event:
- evt.abort()
- self.running_event = []
- self.event_queue = []
- if __name__=='__main__':
- evt = EventDispatch()
- evt.add_all()
复制代码 事件基类:- #coding=gb2312
- #-------------------------------------------------------------------------------
- # Name: 事件基类
- # Purpose:
- #
- # Author: Weigun
- #
- # Created: 08/23/2013
- # Copyright: (c) Administrator 2012
- # Licence: <your licence>
- #-------------------------------------------------------------------------------
- #!/usr/bin/env python
- import os
- import sys
- import time
- from common.util import get_logger
- from common.timer import Timer
- class EventBase(object):
- _EVENT_NAME = '' #--事件名字
- _IDLE = 0 #--事件的3个状态
- _WOKING = 1
- _FINISH = 2
- _SLEEPING = -1
- _WAKEUP = -2
- _KEEP_ALIVE = False
- def __init__(self,*args,**kwargs):
- self.tick = 0 #--repeat型的事件,执行间隔,默认是0秒,如果为0则表示一次性事件
- self.status= self._IDLE
- self.sleep_time = 1 #--默认随眠5秒
- self._EVENT_NAME = self.__class__.__name__
- def keep_alive(self,alive = None):
- '''
- 设置事件是否不销毁
- para: alive = None then return self._KEEP_ALIVE,otherwise setattr self._KEEP_ALIVE = alive
- '''
- if alive:
- self._KEEP_ALIVE = alive
- else:
- return self._KEEP_ALIVE
- def switch(self,staus):
- '''
- 切换事件的状态
- '''
- self.status = staus
- def fire_event(self):
- '''
- 激活事件
- '''
- logger = get_logger('fire_event')
- self.status = self._WOKING
- #logger.info('it woking')
- try:
- #logger.info('timer type:%s,%s'%(Timer,type(Timer)))
- self.task = Timer(self.tick,self.__do)
- #logger.info('timer ready:%s'%(self.task))
- self.task.start()
- logger.info('timer started:%s'%(self.task))
- except:
- pass
- #info=sys.exc_info()
- #logger.info('exception:%s,%s,%s'%(info[0],info[1],info[2]))
- def __do(self):
- #--注意stop的时候该线程是否会停掉
- self.do()
- if self.keep_alive():
- logger = get_logger('keepAlive')
- self.switch(self._SLEEPING)
- logger.info('switch to %s'%(self._SLEEPING))
- while(self.keep_alive()):
- if self.status == self._SLEEPING:
- time.sleep(self.sleep_time)
- #logger.info('after sleep now continue')
- continue
- logger.info('now,wake up,staus is %s'%(self.status))
- self.do()
- self.switch(self._SLEEPING)
- logger.info('switch to %s'%(self._SLEEPING))
- def do(self):
- '''
- 事件的逻辑函数,逻辑代码都往这里填
- '''
- pass
- def abort(self):
- '''
- 强制中断事件
- '''
- self.task.stop()
- if __name__=='__main__':
- evt = EventBase()
复制代码 事件类:- #coding=gb2312
- #-------------------------------------------------------------------------------
- # Name: 模块1
- # Purpose:
- #
- # Author: Administrator
- #
- # Created: 02/03/2012
- # Copyright: (c) Administrator 2012
- # Licence: <your licence>
- #-------------------------------------------------------------------------------
- #!/usr/bin/env python
- import time
- from event import EventBase
- from common.util import get_logger
- from event.eventDispatch import EventDispatch
- class evt_myevt2(EventBase):
- def __init__(self,*args,**kwargs):
- super(evt_myevt2,self).__init__(*args,**kwargs)
- self.tick = 5
- self.loggr = get_logger('evt_myevt2')
- def do(self):
- print 'i am %s,running~~'%(self._EVENT_NAME)
- self.status = self._IDLE
- print 'now i am ',self.status
- self.loggr.info('i am evt_myevt2,good for running')
- time.sleep(10)
- evtmgr = EventDispatch()
- print '--------now i wake up evt_ConfigChk'
- self.loggr.info('--------now i wake up evt_ConfigChk')
- evtmgr.wake_up('evt_ConfigChk')
- if __name__=='__main__':
- evt = EventBase()
复制代码 timer类:- #coding=gb2312
- #-------------------------------------------------------------------------------
- # Name: 模块1
- # Purpose:
- #
- # Author: Administrator
- #
- # Created: 02/03/2012
- # Copyright: (c) Administrator 2012
- # Licence: <your licence>
- #-------------------------------------------------------------------------------
- #!/usr/bin/env python
- import threading
- import time
- import sys
- from common.util import get_logger
- class SimpleTimer(threading.Thread):
- """
- very simple but useless timer.
- """
- def __init__(self, seconds):
- self.runTime = seconds
- threading.Thread.__init__(self)
- def run(self):
- time.sleep(self.runTime)
- print "Buzzzz!! Time's up!"
- class Timer(object):
- def __init__(self, interval, function, args=[], kwargs={}):
- self.logger = get_logger('Timer')
- self.interval = interval
- self.function = function
- self.args = args
- self.kwargs = kwargs
- def start(self,interval = 5):
- self.stop()
- import threading
- self._timer = threading.Timer(interval, self._run)
- self._timer.setDaemon(True)
- self._timer.start()
- self.logger.info('timer instance <%s> started:%s'%(self._timer,interval))
- def restart(self,interval = None):
- self.start(interval or self.interval)
- def stop(self):
- if self.__dict__.has_key("_timer"):
- print 'timer:',self._timer, ' stop'
- self._timer.cancel()
- self.logger.info('timer instance <%s> cancel ok'%(self._timer))
- del self._timer
- def _run(self):
- try:
- self.function(*self.args, **self.kwargs)
- except:
- print 'timer got exception'
- exc_info = sys.exc_info()
- self.logger.info('timer_run got exception:%s,%s'%(exc_info[0],exc_info[1]))
- self.stop()
- if self.interval and self.interval != 0:
- self.restart()
- else:
- self.stop()
- if __name__=='__main__':
- tm = TaskManager()
- tm.loop()
- tm.stop()
复制代码 get_logger方法:- def get_logger(log_name,log_path = None):
- logger = logging.getLogger('[%s]'%(log_name))
- if log_path:
- if os.path.isdir(log_path) and os.path.exists(log_path):
- dirpath = log_path
- else:
- dirpath = config.LOG_DIR
- log_name = log_name + '.log'
- handler = logging.FileHandler(os.path.join(dirpath, log_name))
- formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')
- handler.setFormatter(formatter)
- logger.addHandler(handler)
- logger.setLevel(logging.INFO)
- return logger
复制代码 附上相关的log:
dispatch_dispatch:- 2013-08-27 01:41:43,144 [dispatch_dispatch] INFO after fire_event:<event.customEvent.evt_ConfigChk.evt_ConfigChk object at 0x02688E50>
- 2013-08-27 01:41:43,144 [dispatch_dispatch] INFO running_event num is 1,event_queue num is 3
- 2013-08-27 01:41:43,148 [dispatch_dispatch] INFO after fire_event:<event.customEvent.evt_myevt2.evt_myevt2 object at 0x0268E0F0>
- 2013-08-27 01:41:43,148 [dispatch_dispatch] INFO running_event num is 2,event_queue num is 3
- 2013-08-27 01:41:43,151 [dispatch_dispatch] INFO after fire_event:<event.customEvent.evt_Templet.evt_Templet object at 0x0268E390>
- 2013-08-27 01:41:43,151 [dispatch_dispatch] INFO running_event num is 3,event_queue num is 3
复制代码 dispatch_wake_up:- 2013-08-27 01:41:58,151 [dispatch_wake_up] INFO dispatch instance is <event.eventDispatch.EventDispatch object at 0x0267FC90>, evt is <event.customEvent.evt_ConfigChk.evt_ConfigChk object at 0x02688E50>,wake_up:evt_ConfigChk
复制代码 fire_event:- 2013-08-27 01:41:43,144 [fire_event] INFO timer started:<common.timer.Timer object at 0x02688EF0>
- 2013-08-27 01:41:43,148 [fire_event] INFO timer started:<common.timer.Timer object at 0x0268E210> #--为什么有相同的timer
- 2013-08-27 01:41:43,148 [fire_event] INFO timer started:<common.timer.Timer object at 0x0268E210> #--为什么有相同的timer
- 2013-08-27 01:41:43,150 [fire_event] INFO timer started:<common.timer.Timer object at 0x0268E410>
- 2013-08-27 01:41:43,150 [fire_event] INFO timer started:<common.timer.Timer object at 0x0268E410>
- 2013-08-27 01:41:43,150 [fire_event] INFO timer started:<common.timer.Timer object at 0x0268E410>
复制代码 |
|