注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

眼睛想旅行

技术就是我的生命与信仰!

 
 
 

日志

 
 
关于我

精通C,C++,python,Erlang。并熟悉各种其他编程语言,用cocos2dx游戏引擎作过几个项目。会MySQL增删改查,了解OpenGL渲染原理。懂单片机,能设计数字电路系统,会画电路图和设计电路板。喜欢了解最新前沿技术,并持续关注和学习新技术。

网易考拉推荐

如何用python实现一个多线程定时器  

2015-11-01 07:38:38|  分类: Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
因为自已要写一个和时间有关的方法,每过几秒钟之后要运行一个函数,但在主线程里写一个死循环来作定时器总是觉得不好。正好今天学习了一下python的多线程,可以拿来练手。写了下边的python定时器类,使用这个类你可以在你的代码中加入一个定时器。
代码如下(pytimer.py):

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import threading  

import time

from Queue import Queue  


class _timerThread(threading.Thread):  

    def __init__(self, t_name,queue,cond):  

        threading.Thread.__init__(self, name=t_name) 

        self.threadtimes = []

        self.threadFunc = {}

        self.lasttimes = {}

        self.queue = queue

    def setNewTimer(self,newobj):

        if newobj.func == None:

            self.threadtimes.remove(newobj.secendtime)

            self.threadFunc[str(newobj.secendtime)] = None

            self.lasttimes[str(newobj.secendtime)] = None

        else:

            if newobj.secendtime in self.threadtimes:

                self.threadFunc[str(newobj.secendtime)] = newobj.func

                self.lasttimes[str(newobj.secendtime)] = int(time.time())

            else:

                self.threadtimes.append(newobj.secendtime)

                self.threadFunc[str(newobj.secendtime)] = newobj.func

                self.lasttimes[str(newobj.secendtime)] = int(time.time())

    def run(self):

        while(True):

            if not self.queue.empty():

                objtmp = self.queue.get()

                self.setNewTimer(objtmp)

            timetmp = int(time.time())

            for tx in self.threadtimes:

                if timetmp - self.lasttimes[str(tx)] >= tx:

                    self.lasttimes[str(tx)] = timetmp

                    self.threadFunc[str(tx)](timetmp)

        self.condition.release()

        

class _timerObj():

    def __init__(self,secendt,funct):

        self.secendtime = secendt

        self.func = funct

    

class pytimer():

    def __init__(self):

        self.queue = Queue()   

        self.cond = threading.Condition()

        self.t_thread = _timerThread(str(int(time.time())),self.queue, self.cond) 

        self._timers = []

        self._initTimer()

    def _initTimer(self):

        self.t_thread.setDaemon(True)

        self.t_thread.start()

    def getTimers(self):

        return self._timers

    def setTimer(self,secendTime,Func):

        objtmp = _timerObj(secendTime,Func)

        self._timers.append(secendTime)

        self.queue.put(objtmp)

    def removeTimer(self,secendTime):

        objtmp = _timerObj(secendTime,None)

        self._timers.remove(secendTime)

        self.queue.put(objtmp)


功能测试(test.py):

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import pytimer


def timerCallBack(timex):

    print timex


def main():  

    timerx = pytimer.pytimer()

    timerx.setTimer(2, timerCallBack)

    while(True):

        pass

if __name__ == '__main__':  

    main()


运行测试程序后输出结果:

1446334639

1446334641

1446334643

1446334645

1446334647

1446334649

1446334651

1446334653

...

运行结果与预期想要的结果相同。每两秒调用了一次定时器返回函数。

源码获取地址:https://github.com/fengmm521/pytimer/tree/master
  评论这张
 
阅读(258)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017