1. 程式人生 > >Python並行程式設計(七):執行緒同步之事件

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進來的時候,它將其取出。

      工作流程如圖: