前言:

Event在python线程间同步是一种常用的方法,本博客以生产者线程和工作者线程为例说明Event在线程间进行10次同步的应用。

import threading  from threading import Event, Thread  import time  import random  from time import sleep     pevent = Event() #默认是没有事件的  pevent.clear()     cevent = Event()   cevent.clear()     runtimes = 10  mutex_lock = threading.Lock()        class ProducerThread (threading.Thread):      def __init__(self, name, runflag):          threading.Thread.__init__(self)          self.name = name          self.runflag = runflag          self.continueflag = Event()          self.continueflag.set()                def run(self):          global runtimes            sleep(1)          print ("开始线程:" + self.name)          while self.continueflag.isSet():              print("wait consumer ...")              if runtimes == 0:                  self.continueflag.clear()                  break              pevent.wait()              print("come an consumer ...")              mutex_lock.acquire()              runtimes = runtimes - 1              mutex_lock.release()              pevent.clear()              sleep(1)              cevent.set()          print ("退出线程:" + self.name)          self.runflag.set()     class ConsumerThread (threading.Thread):      def __init__(self,name, runflag):          threading.Thread.__init__(self)          self.name = name          self.runflag = runflag          self.continueflag = Event()          self.continueflag.set()                def run(self):          global runtimes           print ("开始线程:" + self.name)          while self.continueflag.isSet():              if 0 == runtimes:                  self.continueflag.clear()                   pevent.set()                  break              print("I want to consum ... ", runtimes)              pevent.set() #通知生产者要消费              cevent.wait()              cevent.clear()              sleep(1)          print ("退出线程:" + self.name)          self.runflag.set()     def test_pthread():      runflag = Event()       pt = ProducerThread("producer", runflag)      ct = ConsumerThread("consumer", runflag)      pt.start()      ct.start()      pt.join()      ct.join()      runflag.wait()     if __name__ == '__main__':      print('===============begin=================')      test_pthread()      print('===============end=================')

运行结果如下: