国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

瀏覽:22日期: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 編程
相關文章:
主站蜘蛛池模板: 亚洲欧美在线免费 | 操12p| 午夜黄色网 | 国产网站黄 | 久久一日本道色综合久久m 久久伊人成人网 | 亚洲美女影院 | 日韩欧美一区二区在线观看 | 大陆高清自拍 | 亚洲精品视频在线看 | 久久悠 | 成人 欧美 | 成人做爰视频www在线观看 | 久久精品免费全国观看国产 | 亚洲精品一区二区三区在线播放 | 日本www在线播放 | 久久久久久免费一区二区三区 | 日韩三级黄色 | 99国产精品农村一级毛片 | 午夜看片a福利在线 | 中国农村一级毛片 | 又黄又爽又刺激的视频 | 久久综合精品不卡一区二区 | 国产成人欧美视频在线 | 久久99国产乱子伦精品免费 | 在线观看国产欧美 | 九九精品激情在线视频 | 92国产福利久久青青草原 | 国产第一福利影院 | 二区久久国产乱子伦免费精品 | 国产成人精品亚洲777图片 | 亚洲精品久久玖玖玖玖 | 中文字幕一区二区三区久久网站 | 欧美午夜三级我不卡在线观看 | 欧美成人全部视频 | 亚洲欧洲日韩在线 | 免费国产a国产片高清不卡 免费国产不卡午夜福在线 免费国产不卡午夜福在线观看 | 中文字幕日韩精品中文区 | 亚洲男人天堂视频 | 免费一级 一片一毛片 | 亚洲国产成a人v在线 | 日本乱理伦中文三区 |