Python并行编程(七):线程同步之事件
1、基本概念
事件是线程之间用于通讯的对象。有的线程等待信号,有的线程发出信号。基本上事件对象都会维护一个内部变量,可以通过set方法设置为true,也可以通过clear方法设置为false。wait方法将会阻塞线程,直到内部变量为true。
2、使用用例
# coding : utf-8 import time from threading import Thread, Event import random items = [] event = Event() class consumer(Thread): def __init__(self, items, event): Thread.__init__(self) self.items = items self.event = event def run(self): while True: time.sleep(2) print("Cosumer is waiting...") self.event.wait() item = self.items.pop() print("Consumer notify: %d popped from list by %s" %(item, self.name)) class producer(Thread): def __init__(self, integers, event): Thread.__init__(self) self.items = items self.event = event def run(self): global item for i in range(100): time.sleep(2) item = random.randint(0, 256) self.items.append(item) print('Producer notify : item N° %d appended to list by %s' % (item, self.name)) print('Producer notify : event set by %s' % self.name) self.event.set() print('Produce notify : event cleared by %s '% self.name) self.event.clear() if __name__ == '__main__': t1 = producer(items, event) t2 = consumer(items, event) t2.start() t1.start() t2.join() t1.join()
线程t1在list最后添加值,然后设置event来通知消费者,消费者通过wait阻塞,直到收到信号的时候从list中取出元素消费。
producer类初始化时定义了item的list和Event,与条件对象的例子不同,这里的list不是全局的。而是通过参数传入的。
在run方法中,每当item创建,producer类将新item添加到list末尾然后发出事件通知。
consumer类初始化时也定义了item的list和Event()。当item进来的时候,它将其取出。
工作流程如图: