python中Event實(shí)現(xiàn)線程間同步介紹
前言:
Event在python線程間同步是一種常用的方法,本博客以生產(chǎn)者線程和工作者線程為例說明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)是沒有事件的 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() #通知生產(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-09centos系統(tǒng)升級(jí)python 2.7.3
CentOS上安裝的python版本是2.6,不能滿足我運(yùn)行軟件的要求,所以對(duì)python進(jìn)行升級(jí)。Python的最新版本已經(jīng)是3.3,但是Python3的兼容性可能還有一定的問題,所以還是升級(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ì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06python+pyhyper實(shí)現(xiàn)識(shí)別圖片中的車牌號(hào)思路詳解
最近領(lǐng)導(dǎo)給布置了一個(gè)基于圖片識(shí)別車牌號(hào)的工具開發(fā)任務(wù),然后就去研究實(shí)現(xiàn)邏輯,自己根據(jù)opencv寫了一個(gè)小demo,發(fā)現(xiàn)不僅速度慢而且成功率極低。然后,就找到了Hyperlpr開源項(xiàng)目,這篇文章主要介紹了python+pyhyper實(shí)現(xiàn)識(shí)別圖片中的車牌號(hào),需要的朋友可以參考下2022-12-12報(bào)錯(cuò)No?module?named?numpy問題的解決辦法
之前安裝了Python,后來因?yàn)榫毩?xí)使用Python寫科學(xué)計(jì)算的東西,又安裝了Anaconda,但是安裝Anaconda之后又出現(xiàn)了一個(gè)問題,下面這篇文章主要給大家介紹了關(guān)于報(bào)錯(cuò)No?module?named?numpy問題的解決辦法,需要的朋友可以參考下2022-08-08OpenCV凸包檢測(cè)和凸缺陷學(xué)習(xí)示例
這篇文章主要為大家介紹了OpenCV凸包檢測(cè)和凸缺陷學(xué)習(xí)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06