您的位置:首页 > 编程语言 > Python开发

python小点心--Event

2016-02-16 09:38 549 查看
多线程,看起来很美好,但子线程间的互斥与协作,线程间的同步真的是让人头疼,今天,介绍一下 Event

Event可以用来做线程间的通信,使用起来非常简单

event = threading.Event()
上面的语句生成了一个evnet对象,event对象内部有一个内部信号标志,一个新生成的event对象的内部信号标志是False

下面介绍它的方法:

1、wait()

望文生义,就是等待的意思嘛

2、set()

这个方法会将内部信号标志设置为True,上面说到wait(),是等待的意思,等的就是这个信号标志变为True,如果内部信号标志为False,wait()就一直阻塞在那里,后面的语句无法执行

3、clear()

这个函数的作用恰好与set()相反,它将内部信号标志设置False

来一个具体的问题体验一下如何使用evnet

有四个线程,分别打印a,b,c,d,现在要求按照a,b,c,d的顺序打印一百次。

线程一旦启动,就会按照自己的逻辑进行运算,打印a的线程就会一直打印a,打印b的线程就会一直打印b,每个线程都不知道其他三个线程在做什么。要想按照一定的顺序打印,就必须做到线程间的通信,打印a的线程告诉打印b的线程:我已经打印完了,该你了。打印b的线程在打印结束后告诉c,c告诉d,d再告诉a,这样子循环100次。那么问题来了,最初谁来告诉打印a的线程呢?当然是主线程

上代码:

#coding=utf-8
'''
Created on 2016-1-19

@author: Administrator
'''
import threading
import Queue

mq = Queue.Queue()
count = 100
def worker(event,eventnext,s):
global count
global mq
while True:
event.wait()
if s=='a':
print '第' +str(mq.qsize()+1) +'次'
print s
event.clear()
eventnext.set()
if s =='a':
mq.put(1)
if mq.qsize() == count:
break

eventLst = [threading.Event() for i in range(4)]
t1 = threading.Thread(target=worker, args=(eventLst[0],eventLst[1],'a'))
t2 = threading.Thread(target=worker, args=(eventLst[1],eventLst[2],'b'))
t3 = threading.Thread(target=worker, args=(eventLst[2],eventLst[3],'c'))
t4 = threading.Thread(target=worker, args=(eventLst[3],eventLst[0],'d'))
t1.start()
t2.start()
t3.start()
t4.start()
eventLst[0].set()


每个线程都有一个event对象,主线程唤醒打印a的线程,a唤醒b,b唤醒c,以此类推。打印次数我们用Queue 来控制,它是线程安全的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: