0
点赞
收藏
分享

微信扫一扫

python小点心--Event


多线程,看起来很美好,但子线程间的互斥与协作,线程间的同步真的是让人头疼,今天,介绍一下 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 来控制,它是线程安全的。

        

举报

相关推荐

0 条评论