多线程模块的同步机制event对象

线程的核心特征就是他们能够以非确定的方式(即何时开始执行,何时被打断,何时恢复完全由操作系统来调度管理,这是用户和程序员无法确定的)独立执行的,如果程序中有其他线程需要判断某个线程是否已经到达执行过程中的某个点,根据这个判断来执行后续的操作,那么这就产生了非常棘手的线程同步问题,要解决这个问题,我们可以使用threading库中的Event对象。

Event对象和条件标记类似,允许线程等待某个事件发生。初始状态时事件被设置为0,如果事件没有被设置而线程正在等待该事件,,那么线程就会被阻塞,直到事件被设置为止.当有线程设置了这个事件时,就会唤醒所有正在等待该事件的线程,如果线程等待的事件已经设置了,那么线程会继续执行

下面给出了一个简单的示例,使用Event来同步线程的启动

#!/usr/bin/env python
from threading import Thread,Event
import time
def countdown(n,started_evt):
print 'countdown starting'
started_evt.set()
while n>0:
print n
n-=1
time.sleep(5)
started_evt=Event()
print 'Launching countdown'
t=Thread(target=countdown,args=(3,started_evt))
t.start()
started_evt.wait()
print 'countdown is running'

当运行这段代码的时候,字符串'countdown is running'总是会在‘countdown starting’之后显示,这里使用了事件来同步线程,使得主线程等待,直到countdown()函数首先打印启动信息之后采开始执行

简单介绍

vent对象实现了简单的线程通信机制,它提供了设置信号,清楚信号,等待等用于实现线程间的通信。

1 设置信号

使用Event的set()方法可以设置Event对象内部的信号标志为真。Event对象提供了isSet()方法来判断其内部信号标志的状态。当使用event对象的set()方法后,isSet()方法返回真

2 清除信号

使用Event对象的clear()方法可以清除Event对象内部的信号标志,即将其设为假,当使用Event的clear方法后,isSet()方法返回假

3 等待

Event对象wait的方法只有在内部信号为真的时候才会很快的执行并完成返回。当Event对象的内部信号标志位假时,则wait方法一直等待到其为真时才返回。

#!/usr/bin/env python
import threading
import time
class MyThread(threading.Thread):
def __init__(self,signal):
threading.Thread.__init__(self)
self.signal=signal
def run(self):
print "I am %s,i will sleep.."%self.name
self.signal.wait()
print "I am %s,i awake.."%self.name
if __name__=='__main__':
signal=threading.Event()
for t in range(0,3):
thread=MyThread(signal)
thread.start()
print "main thread sleep 3 seconds..."
time.sleep(1)
signal.set()
root@hanfeifei-HP-ProDesk-680-G2-MT:/mnt/han# python event1.py
I am Thread-1,i will sleep..
I am Thread-2,i will sleep..
I am Thread-3,i will sleep..
main thread sleep 3 seconds...
I am Thread-3,i awake..
I am Thread-2,i awake..
I am Thread-1,i awake..

Event内部包含了一个标志位,初始的时候为false。

可以使用使用set()来将其设置为true;

或者使用clear()将其从新设置为false;

可以使用is_set()来检查标志位的状态;

另一个最重要的函数就是wait(timeout=None),用来阻塞当前线程,直到event的内部标志位被设置为true或者timeout超时。如果内部标志位为true则wait()函数理解返回。

~

最新文章

  1. AI(一):概念与资讯
  2. supervisor 配置
  3. QQ视差特效和ListView侧滑删除
  4. Eclipse集成Tomcat的配置步骤实例
  5. 想让安卓 APP 如丝般顺滑?
  6. Spring---Web MVC关于前台传值转换问题
  7. 开发神器之--Sublime Text
  8. React Native 初识
  9. oc深坑測试题及其答案
  10. Java重载重写与实现方法的规则
  11. 【原】Java学习笔记025 - 内部类
  12. wamp 3.0.6(apache 2.4.23) 403 forbidden 解决办法
  13. Kattis之旅——Rational Arithmetic
  14. 【转载】VC IME 通信
  15. Windows10内置Linux子系统
  16. CentOS7安装OpenStack(Rocky版)-07.安装horizon服务组件(控制节点dashboard)
  17. PAT 甲级 1142 Maximal Clique
  18. 如何从 GitHub 上下载单个文件夹?
  19. office2007word文档设置多级目录
  20. 快速找出System.Management.Automation.dll,c#调用powershell

热门文章

  1. LODOP设置纸张无效问题
  2. 【计算机视觉】MTCNN基于NCNN的测试过程
  3. linux系统,CentOs7加新硬盘
  4. JAVA数据结构和算法 3-简单排序
  5. 47.前端css学习、登陆页面的制作
  6. idea设置方法注释
  7. mui mui-control-item获得选中的标签
  8. [百度]将ftp添加到本地映射磁盘的方法
  9. - RabbitMQ - 0 - 介绍、linux 和windows安装
  10. HTTP协议的简单了解