python中Event实现线程间同步介绍_python_

2022年4月15日09:28:54

前言:

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=================')

运行结果如下:

  • 作者:hsy12342611  
  • 原文链接:https://blog.csdn.net/hsy12342611/article/details/124065314
    更新时间:2022年4月15日09:28:54 ,共 1790 字。