博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程模块的同步机制event对象
阅读量:4508 次
发布时间:2019-06-08

本文共 2301 字,大约阅读时间需要 7 分钟。

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

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

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

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

#!/usr/bin/env pythonfrom threading import Thread,Eventimport timedef 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 pythonimport threadingimport timeclass 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.nameif __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()函数理解返回。

~

转载于:https://www.cnblogs.com/hanfei-1005/p/5726119.html

你可能感兴趣的文章
iOS遍历数组的同时删除元素
查看>>
小强的HTML5移动开发之路(16)——神奇的拖放功能
查看>>
zookeeper FastLeaderElection
查看>>
Jquery AJAX如何使用Promise/Deferred实现顺序执行?
查看>>
进度条
查看>>
Delphi加载驱动
查看>>
CPU体系结构(组成部分)
查看>>
HDU 1250 大数加斐波那契数列
查看>>
MySQL学习笔记
查看>>
folly无锁队列正确性说明
查看>>
maven 常用命令
查看>>
spring入门(一) 根据xml实例化一个对象
查看>>
django-创建表的字段属性,表关系
查看>>
docker-ubuntu镜像,nginx镜像
查看>>
2019-07-09 新来的第一天
查看>>
在子线程中new Handler报错--Can't create handler inside thread that has not called Looper.prepare()...
查看>>
Resharp使用大全
查看>>
[NEERC 2004] K小数
查看>>
【Mood-10】每个程序员都应该读的30本书
查看>>
【分享】顾客眼中的价值,才是你的商机
查看>>