python中Event實(shí)現(xiàn)線程間同步介紹
前言:
Event在python線程間同步是一種常用的方法,本博客以生產(chǎn)者線程和工作者線程為例說(shuō)明Event在線程間進(jìn)行10次同步的應(yīng)用。
import threading
from threading import Event, Thread
import time
import random
from time import sleep
?
pevent = Event() #默認(rèn)是沒(méi)有事件的
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 ("開(kāi)始線程:" + 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 ("開(kāi)始線程:" + self.name)
? ? ? ? while self.continueflag.isSet():
? ? ? ? ? ? if 0 == runtimes:
? ? ? ? ? ? ? ? self.continueflag.clear()?
? ? ? ? ? ? ? ? pevent.set()
? ? ? ? ? ? ? ? break
? ? ? ? ? ? print("I want to consum ... ", runtimes)
? ? ? ? ? ? pevent.set() #通知生產(chǎn)者要消費(fèi)
? ? ? ? ? ? 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=================')運(yùn)行結(jié)果如下:

到此這篇關(guān)于python中Event實(shí)現(xiàn)線程間同步介紹的文章就介紹到這了,更多相關(guān)Event線程間同步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python多線程同步Lock、RLock、Semaphore、Event實(shí)例
- 分析Python感知線程狀態(tài)的解決方案之Event與信號(hào)量
- Python中使用threading.Event協(xié)調(diào)線程的運(yùn)行詳解
- python基于event實(shí)現(xiàn)線程間通信控制
- python Event事件、進(jìn)程池與線程池、協(xié)程解析
- 詳解Python 多線程 Timer定時(shí)器/延遲執(zhí)行、Event事件
- 詳解python多線程、鎖、event事件機(jī)制的簡(jiǎn)單使用
- python多線程之事件Event的使用詳解
- Python多線程編程(八):使用Event實(shí)現(xiàn)線程間通信
相關(guān)文章
Python實(shí)現(xiàn)簡(jiǎn)易超市管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python如何實(shí)現(xiàn)簡(jiǎn)易超市管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
centos系統(tǒng)升級(jí)python 2.7.3
CentOS上安裝的python版本是2.6,不能滿(mǎn)足我運(yùn)行軟件的要求,所以對(duì)python進(jìn)行升級(jí)。Python的最新版本已經(jīng)是3.3,但是Python3的兼容性可能還有一定的問(wèn)題,所以還是升級(jí)到2.7較為保險(xiǎn)。2014-07-07
用python按照?qǐng)D像灰度值統(tǒng)計(jì)并篩選圖片的操作(PIL,shutil,os)
這篇文章主要介紹了用python按照?qǐng)D像灰度值統(tǒng)計(jì)并篩選圖片的操作(PIL,shutil,os),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
python+pyhyper實(shí)現(xiàn)識(shí)別圖片中的車(chē)牌號(hào)思路詳解
最近領(lǐng)導(dǎo)給布置了一個(gè)基于圖片識(shí)別車(chē)牌號(hào)的工具開(kāi)發(fā)任務(wù),然后就去研究實(shí)現(xiàn)邏輯,自己根據(jù)opencv寫(xiě)了一個(gè)小demo,發(fā)現(xiàn)不僅速度慢而且成功率極低。然后,就找到了Hyperlpr開(kāi)源項(xiàng)目,這篇文章主要介紹了python+pyhyper實(shí)現(xiàn)識(shí)別圖片中的車(chē)牌號(hào),需要的朋友可以參考下2022-12-12
報(bào)錯(cuò)No?module?named?numpy問(wèn)題的解決辦法
之前安裝了Python,后來(lái)因?yàn)榫毩?xí)使用Python寫(xiě)科學(xué)計(jì)算的東西,又安裝了Anaconda,但是安裝Anaconda之后又出現(xiàn)了一個(gè)問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于報(bào)錯(cuò)No?module?named?numpy問(wèn)題的解決辦法,需要的朋友可以參考下2022-08-08
OpenCV凸包檢測(cè)和凸缺陷學(xué)習(xí)示例
這篇文章主要為大家介紹了OpenCV凸包檢測(cè)和凸缺陷學(xué)習(xí)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

