Python 3.X 实现定时器 Timer,制作抽象的Timer定时器基类

Python 在不依赖第三方库的前提下,对于定时器的实现并不是很完美,但是这不意味着我们无法实现。

阅读了网上的一些资料,得出一些结论,顺手写了一个基类的定时器(Python3)

BaseTimer:

 1 # -*- coding: utf-8 -*-
 2
 3
 4 from abc import ABCMeta, abstractmethod
 5 import time
 6 import threading
 7
 8 class BaseTimer(threading.Thread):
 9     """
10     基础定时器抽象类,可以随意继承本类并且实现exec抽象方法即可定时产生任务
11     """
12     __metaclass__ = ABCMeta
13     def __init__(self,howtime=1.0,enduring=True):
14         """
15         howtime 每次定时的时间
16         enduring 是否是一个持久性的任务,用这个可以控制开关
17         """
18
19         self.enduring = enduring
20         self.howtime = howtime
21         threading.Thread.__init__(self)
22
23     def run(self):
24         time.sleep(self.howtime)  #至少执行一次 任务
25         self.exec()
26         while self.enduring:    #是否持久,或者是否进行运行
27             time.sleep(self.howtime)
28             self.exec()    #每次开始执行任务
29
30     @abstractmethod
31     def exec(self):
32         """抽象方法,子类实现"""
33         pass
34
35     def destroy(self):
36         """销毁自身"""
37         self.enduring = False
38         del self
39
40     def stop(self):
41         self.enduring = False
42
43     def restart(self):
44         self.enduring = True
45
46     def get_status(self):
47         return self.enduring
48         

如何使用?



我们来建立一个新的任务,这个任务是过一段时间就输出:

 1 class TimerMask(BaseTimer):
 2     """定时任务类,不同的业务逻辑"""
 3     def __init__(self,howtime=1.0,enduring=True):
 4         BaseTimer.__init__(self,howtime,enduring)
 5         self.ws=0
 6
 7     def exec(self):
 8         print("HelloWorld!")
 9         self.ws = self.ws + 1  #这里是过0.8秒输出一次
10         if self.ws >5:
11             self.destroy()

加入如下:

 1 if __name__ == "__main__":
 2     Q_w = 0
 3     w = TimerMask(howtime=0.8)
 4     print("-")
 5     w.start()
 6     #这里线程输出这些,做其他事情的
 7     while True:
 8         time.sleep(0.4) #0.4秒
 9         print("- ",Q_w," - WMask:",w)
10         Q_w += 1
11         pass

输出:



于是你可能会想问,那岂不是每个不同的行为都要写一个继承了BaseTimer的类来做事呢,其实不然,你可以写个函数调用的TimerFunc类:

 1 class TimerFunc(BaseTimer):
 2     """可传递任何函数的定时任务类"""
 3     def __init__(self,func,howtime=1.0,enduring=True):
 4         BaseTimer.__init__(self,howtime,enduring)
 5         self.func = func
 6
 7     def exec(self):
 8         self.func() #调用函数
 9
10 #使用方法:
11 def doing():
12     print("Hello")
13
14 w = TimerFunc(doing)
15 w.start()

输出:"Hello",并且会每隔1秒执行一次

是不是觉得可以做一堆事情了?你可以自由发挥,继承BaseTimer类

1 w = TimerFunc(doing,5,False) #这样就可以定义延迟5秒使用了~
2 w.start()


在搜索资料的时候,找到了网上大部分的实现方法,其实都差不多,感兴趣你可以看看:

 1 import threading ,time
 2 from time import sleep, ctime
 3 class Timer(threading.Thread):
 4         """
 5         very simple but useless timer.
 6         """
 7         def __init__(self, seconds):
 8                 self.runTime = seconds
 9                 threading.Thread.__init__(self)
10         def run(self):
11                 time.sleep(self.runTime)
12                 print ("Buzzzz!! Time‘s up!")
13
14 class CountDownTimer(Timer):
15         """
16         a timer that can counts down the seconds.
17         """
18         def run(self):
19                 counter = self.runTime
20                 for sec in range(self.runTime):
21                         print (counter)
22                         time.sleep(1.0)
23                         counter -= 1
24                 print ("Done")
25
26 class CountDownExec(CountDownTimer):
27         """
28         a timer that execute an action at the end of the timer run.
29         """
30         def __init__(self, seconds, action, args=[]):
31                 self.args = args
32                 self.action = action
33                 CountDownTimer.__init__(self, seconds)
34         def run(self):
35                 CountDownTimer.run(self)
36                 self.action(self.args)
37
38 def myAction(args=[]):
39         print ("Performing my action with args:")
40         print (args)
41
42 if __name__ == "__main__":
43         t = CountDownExec(3, myAction, ["hello", "world"])
44         t.start()
45         print("2333")

 1 ‘‘‘
 2 使用sched模块实现的timer,sched模块不是循环的,一次调度被执行后就Over了,如果想再执行,可以使用while循环的方式不停的调用该方法
 3 Created on 2013-7-31
 4
 5 @author: Eric
 6 ‘‘‘
 7 import time, sched
 8
 9 #被调度触发的函数
10 def event_func(msg):
11     print("Current Time:", time.strftime("%y-%m-%d %H:%M:%S"), ‘msg:‘, msg)
12
13 def run_function():
14     #初始化sched模块的scheduler类
15     s = sched.scheduler(time.time, time.sleep)
16     #设置一个调度,因为time.sleep()的时间是一秒,所以timer的间隔时间就是sleep的时间,加上enter的第一个参数
17     s.enter(0, 2, event_func, ("Timer event.",))
18     s.run()
19
20 def timer1():
21     while True:
22         #sched模块不是循环的,一次调度被执行后就Over了,如果想再执行,可以使用while循环的方式不停的调用该方法
23         time.sleep(1)
24         run_function()
25
26 if __name__ == "__main__":
27     timer1()


感谢耐心阅读,希望对你有帮助。

时间: 2024-08-23 12:18:26

Python 3.X 实现定时器 Timer,制作抽象的Timer定时器基类的相关文章

cocos2d-js 越来越慢的定时器schedule 制作不变慢的定时器

对于动画控制,可能一点误差,大家不会察觉,但如果多次循环累积或网络同步等,大家就会很清楚意识到schedule的误差问题. 首先做一个例子证明一下: var InaccuracyTestLayer = cc.Layer.extend({ ctor: function () { this._super(); var startTime = new Date().getTime(); var count = 0; this.schedule(function(){ var timePass = ne

python(七):元类与抽象基类

一.实例创建 在创建实例时,调用__new__方法和__init__方法,这两个方法在没有定义时,是自动调用了object来实现的.python3默认创建的类是继承了object. class A(object): def __init__(self, *args, **kwargs): self.name, self.age, self.gender = args[:3] def __new__(cls, *args, **kwargs): print("__new__ has called.

简单定时器的制作。

在进行定时器的制作时,我想先把我们需要用到的一些东西介绍给大家. 定时器的作用 开启定时器  setInterval 间隔型  setTimeout 延迟型 停止定时器  clearInterval  clearTimeout 数码时钟思路效果  获取系统时间:   date对象   getHours getMinutes getSeconds   显示系统时间   字符串连接   空位补零 设置图片路径charAt方法 操作前,我们需要用PS裁剪出0—9的数字图片来,以便让我们看到直观美化的效

定时器的制作与清除

1 <HTML> 2 <HEAD> 3 <META http-equiv="Content-Type" content="text/html; charset=gb2312"> 4 <TITLE>无标题文档</TITLE> 5 <STYLE type="text/css"> 6 <!-- 7 /*设置样式:无边框的文本框*/ 8 INPUT { 9 font-size:

Python 接口:从协议到抽象基类

抽象基类的常见用途:实现接口时作为超类使用.然后,说明抽象基类如何检查具体子类是否符合接口定义,以及如何使用注册机制声明一个类实现了某个接口,而不进行子类化操作.最后,说明如何让抽象基类自动“识别”任何符合接口的类——不进行子类化或注册. Python文化中的接口和协议 接口在动态类型语言中是怎么运作的呢?首先,基本的事实是,Python语言没有 interface 关键字,而且除了抽象基类,每个类都有接口:类实现或继承的公开属性(方法或数据属性),包括特殊方法,如__getitem__ 或 _

storm定时器timer源码分析-timer.clj

storm定时器与java.util.Timer定时器比较相似.java.util.Timer定时器实际上是个线程,定时调度所拥有的TimerTasks:storm定时器也有一个线程负责调度所拥有的"定时任务".storm定时器的"定时任务"是一个vector类型的数据[time, callback, uuid],内有会有三个值,分别是时间.函数.和uuid,很好理解,时间表示该定时任务什么时候执行,函数表示要执行的函数,uuid用于标识该"定时任务&qu

流畅python学习笔记:第十一章:抽象基类

__getitem__实现可迭代对象.要将一个对象变成一个可迭代的对象,通常都要实现__iter__.但是如果没有__iter__的话,实现了__getitem__也可以实现迭代.我们还是用第一章扑克牌的例子来看下 class FrenchDeck:     ranks=[str(n) for n in range(2,11)] + list('JQKA')     suits='spades diamonds clubs hearts'.split()     def __init__(sel

nRF51822使用Timer制作4路PWM波详解

Date:2015.5.8 Author:杨正  QQ:1209758756 <[email protected]> 一.            pwm简介 PWM英文名叫Pulse Width Modulation,中文名叫脉宽调制.那它到底是什么呢?其实它是由定时器产生的,比普通的定时器多了一个比较寄存器.PWM里面有一个词叫占空比,即一个周期内,高电平持续时间与周期的比值.如下图: 占空比(dutycycle) = t/T. PWM用途:控制电机调速,控制蜂鸣器播放音乐,控制led灯亮度

两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz

1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; public class EmailReportTask extends TimerTask{ @Override public void run() { ... } } 在Spring定义 ... 配置Spring定时器 <bean id="scheduleReportTask" class="org.springfra