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进来的时候,它将其取出。

      工作流程如图:

      

原文地址:https://www.cnblogs.com/dukuan/p/9774298.html