Timer继承子Thread类,是Thread的子类,也是线程类,具有线程的能力和特征。这个类用来定义多久执行一个函数。

它的实例是能够延迟执行目标函数的线程,在真正执行目标函数之前,都可以cancel它。

Timer源码:

class Timer(Thread):

def __init__(self, interval, function, args=None, kwargs=None):

Thread.__init__(self)

self.interval = interval

self.function = function

self.args = args if args is not None else []

self.kwargs = kwargs if kwargs is not None else {}

self.finished = Event()

def cancel(self):

"""Stop the timer if it hasn't finished yet."""

self.finished.set()

def run(self):

self.finished.wait(self.interval)

if not self.finished.is_set():

self.function(*self.args, **self.kwargs)

self.finished.set()

Timer类使用方法与Thread定义子线程一样,interval传入间隔时间,function传入线程执行的函数,args和kwargs传入函数的参数。

提前cancel:

import threading

import time

def add(x,y):

print(x+y)

t = threading.Timer(10,add,args=(4,5))

t.start()

time.sleep(2)

t.cancel()

print("===end===")

运行结果:

===end===

start方法执行之后,Timer对象会处于等待状态,等待10秒之后会执行add函数。同时,在执行add函数之前的等待阶段,主线程使用了子线程的cancel方法,就会跳过执行函数结束。

使用event 事件实现Timer计时器:

import threading

import logging

import time

logging.basicConfig(level=logging.INFO)

# class MyTimer(threading.Thread):

class MyTimer:

def __init__(self,interval,fn,args=None):

self.interval = interval

self.fn = fn

self.args = args

self.event = threading.Event()

def start(self):

threading.Thread(target=self.__do).start()

def cancel(self):

self.event.set()

def __do(self):

self.event.wait(self.interval)

if not self.event.is_set():

self.fn(*self.args)

def add(x,y):

logging.warning(x+y)

t = MyTimer(5,add,(4,5))

t.start()

# time.sleep(2)

# t.cancel()

运行结果:

WARNING:root:9

Event事件,是线程间通信机制中最简单的实现,使用一个内部的标记flag,通过flag的True或False的变化来进行操作。

Event源码:

class Event:

def __init__(self):

self._cond = Condition(Lock())

self._flag = False

def _reset_internal_locks(self):

self._cond.__init__(Lock())

def is_set(self):

return self._flag

isSet = is_set

def set(self):

with self._cond:

self._flag = True

self._cond.notify_all()

def clear(self):

with self._cond:

self._flag = False

def wait(self, timeout=None):

with self._cond:

signaled = self._flag

if not signaled:

signaled = self._cond.wait(timeout)

return signaled

Event 方法:

•set()                    flag设置为True

•clear()                 flag设置为False

•is_set()                flag是否为True,返回布尔值

•wait(timeout=None)  设置等待flag变为True的时长,None为无限等待。等到了返回True,未等到超时了就返回False。

举例:

老板雇佣了一个工人,让他生产杯子,老板一直等着工人,直到生产了10个杯子。

import threading

import logging

import time

logging.basicConfig(level=logging.INFO)

cups = []

event = threading.Event()#event对象

def boss(e:threading.Event):

if e.wait(30):#最多等待30秒

logging.info('Good job.')

def worker(n,e:threading.Event):

while True:

time.sleep(0.5)

cups.append(1)

logging.info('make 1')

if len(cups) >=n:

logging.info('I finished my job. {}'.format(len(cups)))

e.set()#flag设置为True

break

b = threading.Thread(target=boss,name='boos',args=(event,))

w = threading.Thread(target=worker,args=(10,event))

w.start()

b.start()

运行结果:

INFO:root:make 1

INFO:root:make 1

INFO:root:make 1

INFO:root:make 1

INFO:root:make 1

INFO:root:make 1

INFO:root:make 1

INFO:root:make 1

INFO:root:make 1

INFO:root:make 1

INFO:root:I finished my job. 10

INFO:root:Good job.

老板和工人使用同一个Event对象的标记flag。

老板wait()设置为最多等待30秒,等待flag变为True,工人在做够10杯子时,将flag设置为True,工人必须在30秒之内没有做好杯子。

wait的使用:

import threading

import logging

logging.basicConfig(level=logging.INFO)

def do(event:threading.Event,interval:int):

while not event.wait(interval): # not event.wait(1) = True

logging.info('To do sth.')

e = threading.Event()

t = threading.Thread(target=do,args=(e,1))

t.start()

e.wait(10) # 也可以使用time.sleep(10)

e.set()

print('Man Exit.')

运行结果:

INFO:root:To do sth.

INFO:root:To do sth.

INFO:root:To do sth.

INFO:root:To do sth.

INFO:root:To do sth.

INFO:root:To do sth.

INFO:root:To do sth.

INFO:root:To do sth.

INFO:root:To do sth.

Man Exit.

wait与sleep的区别是:wait会主动让出时间片,其它线程可以被调度,而sleep会占用时间片不让出。

小结:

Timer定时器继承自Thread类,也是线程类。它的作用是等待n秒钟之后执行某个目标函数,可以使用cancel提前取消。

Event事件是通过True和False维护一个flag标记值,通过这个标记的值来决定做某事,wait()方法可以设置最长等待flag设置为Ture的时长,超时还未设置为True就返回False。

PS:下面看下python之定时器Timer

timer类

Timer(定时器)是Thread的派生类,用于在指定时间后调用一个方法。

构造方法:

Timer(interval, function, args=[], kwargs={})

interval: 指定的时间

function: 要执行的方法

args/kwargs: 方法的参数

实例方法:

Timer从Thread派生,没有增加实例方法。

例子一:

# encoding: UTF-8

import threading

def func():

print 'hello timer!'

timer = threading.Timer(5, func)

timer.start()

线程延迟5秒后执行。

总结

以上所述是小编给大家介绍的详解Python 多线程 Timer定时器/延迟执行、Event事件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

本文标题: 详解Python 多线程 Timer定时器/延迟执行、Event事件

本文地址: http://www.cppcns.com/jiaoben/python/263981.html

python线程延时函数_详解Python 多线程 Timer定时器/延迟执行、Event事件相关推荐

  1. python中延时函数_详解python中实现延时回调普通函数

    这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 前言 ...

  2. python中index函数_详解python中的index函数用法

    1.函数的创建 def fun(): #定义 print('hellow') #函数的执行代码 retrun 1 #返回值 fun() #执行函数 2.函数的参数 普通参数 :要按照顺序输入参数 de ...

  3. python中减法运算函数_详解 Python 的二元算术运算,为什么说减法只是语法糖?...

    原题 | Unravelling binary arithmetic operations in Python 作者 | Brett Cannon 译者 | 豌豆花下猫("Python猫&q ...

  4. python中setattr用法_详解Python的hasattr() getattr() setattr() 函数使用方法

    hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...

  5. python 减法函数_详解 Python 的二元算术运算,为什么说减法只是语法糖?

    大家对我解读属性访问的博客文章反应热烈,这启发了我再写一篇关于 Python 有多少语法实际上只是语法糖的文章.在本文中,我想谈谈二元算术运算. 具体来说,我想解读减法的工作原理:a - b.我故意选 ...

  6. python变量定义大全_详解python变量与数据类型

    这篇文章我们学习 Python 变量与数据类型 变量 变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问.在 Python 中 变量命名规定,必须是大小写英文,数字 ...

  7. python装饰器由浅入深_详解Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  8. python换照片底色_详解Python给照片换底色(蓝底换红底)

    现在网上出现了很多在线换底色的网页版工具是这么做的呢?其实用Python就可以实现. 环境要求 Python3 numpy函数库 opencv库 安装 下载适应版本的numpy函数库,我电脑是WIN1 ...

  9. python实现日历功能_详解Python日历模块的使用

    calendar模块的函数都是日历相关的,提供了对日期的一些操作方法,和生成日历的方法. calendar模块中提供了三大类: 一.calendar.Calendar(firstweekday=0) ...

最新文章

  1. Nature灵魂拷问:微生物组数据一大堆,如何能改变人类健康?
  2. Oracle 11 密码永不过期
  3. 互联网人不敢生孩子:加班多、想跳槽、怕被边缘化
  4. struts.xml 属性介绍
  5. python解析xml文件选用模块_Python标准库系列之xml模块
  6. Echarts地图详细镇区的划分_echarts乡镇地图,echarts地图街道-算法与数据结构文档
  7. 静态路由和DHCP/NAT/VLAN的配置实例
  8. eclipse如何设置自己喜欢的主题
  9. Excel VBA解密教程
  10. fastboot模式下无法找到设备,不能使用fastboot命令,需要安装驱动
  11. 计算机职业规划备选方案,职业规划中的备选方案.doc
  12. msdtc.exe dll劫持
  13. matlab飞思卡尔工具包,飞思卡尔(Freescale)开发工具.PDF
  14. 程序员面试时会遇上哪些问题
  15. WM_INITDIALOG与WM_CREATE消息的区别
  16. 一级注册消防工程师招生简章
  17. Alist常用样式代码
  18. android 输入法 确定按钮,Android 输入法笔记
  19. DFS【深度优先搜索】的一个小小代码—破解QQ一笔画
  20. 计算机信息计量单位 英文名称byte,5.计算机中的字节是个常用的单位,它的英文名字为( )。...

热门文章

  1. Java实现 LeetCode 77 组合
  2. 备忘录,kotlin匿名内部类写法
  3. kotlin中使用匿名内部类
  4. dell 笔记本 ubuntu 安装 无线网卡驱动(Qualcomm Atheros QCA9565 / AR9565 Wireless Network Adapter)
  5. Java NIO epoll 空转问题 + Netty 解决方法
  6. 儿童多动症亚型的脑结构改变和相关症状
  7. Simulink的组合风速模型
  8. Codeforces 723F st-Spanning Tree(连通性乱搞)
  9. 拜耳管理委员会主席沃纳·保曼对话中国发展高层论坛创新演讲
  10. 第二章 2.2 什么是抽象数据类型?