Python 多线程技巧 用threading.Event代替time.sleep()
果我们碰到了这样的场景:线程1做一件时间较长的事情,等做完了,主程序去测试其状态是不是真的更改了。

通常比较容易想到的是:

  1. 线程1里,用大循环来模拟这个长时间的函数,比如for i in range(1, 10000)等等;

  2. 主程序里,用比如time.sleep(60)去等待,默许60秒应该已经够线程1去run了。

显然,这样做是不严谨的,因为没办法确切控制线程1的时间,所以测试程序可能会fail掉。

好的解决办法是用threading.Event的wait()和set()来精确控制线程。

见代码如下:

线程1:Work

主线程:跟踪测试is_done的状态。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import threading
def DoWork(work, callback):  def Task():  print 'work begin...'  work()  print 'work done!'  print 'callback begin...'  callback()  print 'callback done!'  t = threading.Thread(target=Task)  t.start()
def TestWorkAndDone():  is_started = threading.Event()  can_done = threading.Event()  is_done = threading.Event()  def Work():  """it's not a good idea to use huge for loop here to kill time, because the start and end time are not under the control. """  print '1'  is_started.set()  print '2'  # block here until can_done.set() is called.  can_done.wait(timeout=60)  # .await() in Java  print '7'  DoWork(work=Work, callback=lambda:is_done.set())  print '3'  # block here until is_started.set() is called.  is_started.wait(timeout=60)  print '4'  if is_started.isSet():  print 'SUCCESS: Work started'  if is_done.isSet():  print 'FAILD: Work hasnot done'  print '5'  can_done.set()  # Work() is unblock.  print '6'  # block here until callback() is called.  # no need to use time.sleep(60) here.  is_done.wait(timeout=60)  if is_done.isSet():  print '<mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>SUCCESS: Work done'
# main
TestWorkAndDone()

转载于:https://www.cnblogs.com/jian-pan/p/6641919.html

threading.Event相关推荐

  1. Python threading中event的使用

    通过threading.Event()可以创建一个事件管理标志,该标志(event)默认为False,event对象主要有四种方法可以调用: event.wait(timeout=None):调用该方 ...

  2. Python3多线程threading介绍(转载)

    多线程介绍 在python3中,通过该threading模块提供线程的功能.原来的thread模块已经废弃.但是,threading模块中有个Thread类是模块中最主要的线程类,一定要记住!!! t ...

  3. Python-----多线程threading用法

    threading模块是Python里面常用的线程模块,多线程处理任务对于提升效率非常重要,先说一下线程和进程的各种区别,如图 概括起来就是 IO密集型(不用CPU) 多线程计算密集型(用CPU) 多 ...

  4. python 信号量,Event, 定时器

    信号量 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行. 如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群路 ...

  5. 【Rollo的Python之路】Python 同步条件 学习笔记 Event

    Python 同步条件: 条件同步和条件变量同步差不多,只是少了锁 功能,因为条件同步设计于不访问共享资源的条件环境.event = threading.Event():条件环境对象 初始值为:Fal ...

  6. Python模块学习:threading 多线程控制和处理

    Reference:http://python.jobbole.com/81546/ threading.Thread Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有 ...

  7. python多线程之threading

    一.创建线程的方法 1.用 thread.Thread 直接在线程中运行函数 import threading def threadfun(x,y): #线程任务函数 threadfun() for ...

  8. python并发入门(part5 event对象)

    一.引入event.  每个线程,都是一个独立运行的个体,并且每个线程的运行状态是无法预测的. 如果一个程序中有很多个线程,程序的其他线程需要判断某个线程的运行状态,来确定自己下一步要执行哪些操作.  ...

  9. Day28:Event对象、队列、multiprocessing模块

    一.Event对象 线程的一个关键特性是每个线程都是独立运行且状态不可预测.如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就 会变得非常棘手.为了解决这些问题, ...

最新文章

  1. Redis学习和环境搭建
  2. RxJava使用(四)变换
  3. Spring-国际化信息02-MessageSource接口
  4. P4092-[HEOI2016/TJOI2016]树【线段树,倍增】
  5. linux的驱动开发——内核模块如何使用?
  6. 【Java】Java计时器(秒表),java基础面试笔试题
  7. java s类型_javasript基础——数据类型与数据类型转换
  8. 调用虚拟内存编译时的error处理
  9. python实现微信自动发信息软件_Python实现给微信好友自动发送消息的示例
  10. 小波分析工具包 matlab,matlab小波工具箱下载|
  11. java判断百分数_Java 验证前台返回的是不是百分数 在后台用正则表达式验证百分比数据...
  12. 第三代航空轴承钢产品 css-42l,航空轴承钢的发展及热处理技术(一)
  13. 用python生成个性二维码生成器_Python 生成个性二维码
  14. 深入理解计算机系统----第五章优化程序性能
  15. Linux-系统管理16-磁盘配额
  16. 统计|如何理解多元线性回归的F检验的作用与目的
  17. OHIF记录(二)——Viewers和React-vtk工具包互联
  18. Python优秀函数库集锦(二)
  19. 爬虫有道翻译接口+图片文字识别
  20. Oracle 官网下载地址

热门文章

  1. 在C++程序中调用被C编译器编译后的函数为什么要加extern“C”?
  2. 剑指offer面试题[6]-重建二叉树
  3. python读压缩文件内容_使用Python读写及压缩和解压缩文件的示例
  4. 2022春季“金三银四”跳槽必备:软件测试面试题(附带答案)
  5. 程序人生:半路转行再来学软件测试,能够成为大牛吗?
  6. lesson 7 strategies for efficient CUDA programming
  7. the difference between a material and an effect
  8. 基于预训练深度学习算法的番茄作物病害分类
  9. MATLAB模拟导热过程,一维热传导MATLAB模拟.doc
  10. linux 修改php配置,PHP部署时的几个配置修改说明