电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python中使用threading.Event協調線程的運行詳解

瀏覽:50日期:2022-07-26 16:51:52

threading.Event機制類似于一個線程向其它多個線程發號施令的模式,其它線程都會持有一個threading.Event的對象,這些線程都會等待這個事件的“發生”,如果此事件一直不發生,那么這些線程將會阻塞,直至事件的“發生”。

對此,我們可以考慮一種應用場景(僅僅作為說明),例如,我們有多個線程從Redis隊列中讀取數據來處理,這些線程都要嘗試去連接Redis的服務,一般情況下,如果Redis連接不成功,在各個線程的代碼中,都會去嘗試重新連接。

如果我們想要在啟動時確保Redis服務正常,才讓那些工作線程去連接Redis服務器,那么我們就可以采用threading.Event機制來協調各個工作線程的連接操作:

主線程中會去嘗試連接Redis服務,如果正常的話,觸發事件,各工作線程會嘗試連接Redis服務。

為此,我們可以寫下如下的程序:

import threadingimport timeimport logging logging.basicConfig(level=logging.DEBUG, format=’(%(threadName)-10s) %(message)s’,) def worker(event): logging.debug(’Waiting for redis ready...’) event.wait() logging.debug(’redis ready, and connect to redis server and do some work [%s]’, time.ctime()) time.sleep(1) readis_ready = threading.Event()t1 = threading.Thread(target=worker, args=(readis_ready,), name=’t1’)t1.start() t2 = threading.Thread(target=worker, args=(readis_ready,), name=’t2’)t2.start() logging.debug(’first of all, check redis server, make sure it is OK, and then trigger the redis ready event’)time.sleep(3) # simulate the check progress readis_ready.set()

運行這個程序:

(t1 ) Waiting for redis ready...(t2 ) Waiting for redis ready...(MainThread) first of all, check redis server, make sure it is OK, and then trigger the redis ready event(t2 ) redis ready, and connect to redis server and do some work [Wed Nov 5 12:45:03 2014](t1 ) redis ready, and connect to redis server and do some work [Wed Nov 5 12:45:03 2014]

t1和t2線程開始的時候都阻塞在等待redis服務器啟動的地方,一旦主線程確定了redis服務器已經正常啟動,那么會觸發redis_ready事件,各個工作線程就會去連接redis去做相應的工作。

threading.Event的wait方法還接受一個超時參數,默認情況下如果事件一直沒有發生,wait方法會一直阻塞下去,而加入這個超時參數之后,如果阻塞時間超過這個參數設定的值之后,wait方法會返回。

對應于上面的應用場景,如果Redis服務器一致沒有啟動,我們希望子線程能夠打印一些日志來不斷地提醒我們當前沒有一個可以連接的Redis服務,我們就可以通過設置這個超時參數來達成這樣的目的:

import threadingimport timeimport logging logging.basicConfig(level=logging.DEBUG, format=’(%(threadName)-10s) %(message)s’,) def worker(event): while not event.is_set(): logging.debug(’Waiting for redis ready...’) event.wait(1) logging.debug(’redis ready, and connect to redis server and do some work [%s]’, time.ctime()) time.sleep(1) readis_ready = threading.Event()t1 = threading.Thread(target=worker, args=(readis_ready,), name=’t1’)t1.start() t2 = threading.Thread(target=worker, args=(readis_ready,), name=’t2’)t2.start() logging.debug(’first of all, check redis server, make sure it is OK, and then trigger the redis ready event’)time.sleep(3) # simulate the check progress readis_ready.set()

與前面的無限阻塞版本唯一的不同就是,我們在工作線程中加入了一個while循環,直到redis_ready事件觸發之后才會結束循環,wait方法調用會在1秒的超時后返回,這樣,我們就可以看到各個工作線程在系統啟動的時候等待redis_ready的同時,會記錄一些狀態信息。

以下是這個程序的運行結果:

(t1 ) Waiting for redis ready...(t2 ) Waiting for redis ready...(MainThread) first of all, check redis server, make sure it is OK, and then trigger the redis ready event(t2 ) Waiting for redis ready...(t1 ) Waiting for redis ready...(t2 ) Waiting for redis ready...(t1 ) Waiting for redis ready...(t2 ) redis ready, and connect to redis server and do some work [Wed Nov 5 13:55:46 2014](t1 ) redis ready, and connect to redis server and do some work [Wed Nov 5 13:55:46 2014]

這樣,我們就可以在等待Redis服務啟動的同時,看到工作線程里正在等待的情況。

以上這篇Python中使用threading.Event協調線程的運行詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 国标白水泥,高标号白水泥,白水泥厂家-淄博华雪建材有限公司 | 瑞典Blueair空气净化器租赁服务中心-专注新装修办公室除醛去异味服务! | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 网站建设-网站制作-网站设计-网站开发定制公司-网站SEO优化推广-咏熠软件 | 天津热油泵_管道泵_天津高温热油泵-天津市金丰泰机械泵业有限公司【官方网站】 | 精密光学实验平台-红外粉末压片机模具-天津博君 | 浙江红酒库-冰雕库-气调库-茶叶库安装-医药疫苗冷库-食品物流恒温恒湿车间-杭州领顺实业有限公司 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 农业四情_农业气象站_田间小型气象站_智慧农业气象站-山东风途物联网 | 首页_欧瑞传动官方网站--主营变频器、伺服系统、新能源、软起动器、PLC、HMI | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 接地电阻测试仪[厂家直销]_电缆故障测试仪[精准定位]_耐压测试仪-武汉南电至诚电力设备 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 | 轴流风机-鼓风机-离心风机-散热风扇-罩极电机,生产厂家-首肯电子 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 中宏网-今日新闻-财经新闻 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 打包箱房_集成房屋-山东佳一集成房屋有限公司 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | 蒸压釜-陶粒板隔墙板蒸压釜-山东鑫泰鑫智能装备有限公司 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 主题班会网 - 安全教育主题班会,各类主题班会PPT模板 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 翅片管换热器「型号全」_厂家-淄博鑫科环保 | TTCMS自助建站_网站建设_自助建站_免费网站_免费建站_天天向上旗下品牌 | WTB5光栅尺-JIE WILL磁栅尺-B60数显表-常州中崴机电科技有限公司 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 防火板_饰面耐火板价格、厂家_品牌认准格林雅 |