av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Python中使用threading.Event協(xié)調(diào)線程的運(yùn)行詳解

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

threading.Event機(jī)制類似于一個(gè)線程向其它多個(gè)線程發(fā)號(hào)施令的模式,其它線程都會(huì)持有一個(gè)threading.Event的對(duì)象,這些線程都會(huì)等待這個(gè)事件的“發(fā)生”,如果此事件一直不發(fā)生,那么這些線程將會(huì)阻塞,直至事件的“發(fā)生”。

對(duì)此,我們可以考慮一種應(yīng)用場(chǎng)景(僅僅作為說(shuō)明),例如,我們有多個(gè)線程從Redis隊(duì)列中讀取數(shù)據(jù)來(lái)處理,這些線程都要嘗試去連接Redis的服務(wù),一般情況下,如果Redis連接不成功,在各個(gè)線程的代碼中,都會(huì)去嘗試重新連接。

如果我們想要在啟動(dòng)時(shí)確保Redis服務(wù)正常,才讓那些工作線程去連接Redis服務(wù)器,那么我們就可以采用threading.Event機(jī)制來(lái)協(xié)調(diào)各個(gè)工作線程的連接操作:

主線程中會(huì)去嘗試連接Redis服務(wù),如果正常的話,觸發(fā)事件,各工作線程會(huì)嘗試連接Redis服務(wù)。

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

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()

運(yùn)行這個(gè)程序:

(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線程開始的時(shí)候都阻塞在等待redis服務(wù)器啟動(dòng)的地方,一旦主線程確定了redis服務(wù)器已經(jīng)正常啟動(dòng),那么會(huì)觸發(fā)redis_ready事件,各個(gè)工作線程就會(huì)去連接redis去做相應(yīng)的工作。

threading.Event的wait方法還接受一個(gè)超時(shí)參數(shù),默認(rèn)情況下如果事件一直沒有發(fā)生,wait方法會(huì)一直阻塞下去,而加入這個(gè)超時(shí)參數(shù)之后,如果阻塞時(shí)間超過這個(gè)參數(shù)設(shè)定的值之后,wait方法會(huì)返回。

對(duì)應(yīng)于上面的應(yīng)用場(chǎng)景,如果Redis服務(wù)器一致沒有啟動(dòng),我們希望子線程能夠打印一些日志來(lái)不斷地提醒我們當(dāng)前沒有一個(gè)可以連接的Redis服務(wù),我們就可以通過設(shè)置這個(gè)超時(shí)參數(shù)來(lái)達(dá)成這樣的目的:

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()

與前面的無(wú)限阻塞版本唯一的不同就是,我們?cè)诠ぷ骶€程中加入了一個(gè)while循環(huán),直到redis_ready事件觸發(fā)之后才會(huì)結(jié)束循環(huán),wait方法調(diào)用會(huì)在1秒的超時(shí)后返回,這樣,我們就可以看到各個(gè)工作線程在系統(tǒng)啟動(dòng)的時(shí)候等待redis_ready的同時(shí),會(huì)記錄一些狀態(tài)信息。

以下是這個(gè)程序的運(yùn)行結(jié)果:

(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服務(wù)啟動(dòng)的同時(shí),看到工作線程里正在等待的情況。

以上這篇Python中使用threading.Event協(xié)調(diào)線程的運(yùn)行詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产欧美欧洲 | 久久精品毛片 | 欧美激情在线观看 | 精品久久久久久 | 在线一区二区三区 | 精品久久一区 | 真实人妻互换毛片视频 | 中文字幕在线观看亚洲 | 日韩精品影院 | 国产日韩精品一区二区 | 婷婷综合五月天 | 手机av在线免费观看 | 欧美性猛交一区二区三区精品 | 亚洲va视频 | 成年人免费看视频 | 亚洲影音 | 亚洲一区二区免费 | 日韩视频在线观看 | 国产精品理论片 | 国产又粗又黄又爽又硬的视频 | 色哟哟一区二区 | 男人添女人囗交图 | 欧美激情视频一区 | 一区二区网站 | 国产激情网 | 91蜜桃婷婷狠狠久久综合9色 | 久久九九视频 | www.成人在线| 成人福利在线观看 | 黄色免费网站在线观看 | 午夜黄视频 | 亚洲久久在线 | 亚洲精品久久久蜜桃 | 中文字幕系列 | 国产乡下妇女做爰视频 | 成人免费毛片片v | 国产91在线播放 | 又黄又爽的网站 | 日韩欧美高清 | 国产精品一区二区久久 | 成人在线免费视频 |