日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
一日一技:Python多線(xiàn)程的事件監(jiān)控

設(shè)想這樣一個(gè)場(chǎng)景:

創(chuàng)新互聯(lián)建站于2013年成立,先為奇臺(tái)等服務(wù)建站,奇臺(tái)等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為奇臺(tái)企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

你創(chuàng)建了10個(gè)子線(xiàn)程,每個(gè)子線(xiàn)程分別爬一個(gè)網(wǎng)站,一開(kāi)始所有子線(xiàn)程都是阻塞等待。一旦某個(gè)事件發(fā)生:例如有人在網(wǎng)頁(yè)上點(diǎn)了一個(gè)按鈕,或者某人在命令行輸入了一個(gè)命令,10個(gè)爬蟲(chóng)同時(shí)開(kāi)始工作。

肯定有人會(huì)想到用Redis來(lái)實(shí)現(xiàn)這個(gè)開(kāi)關(guān):所有子線(xiàn)程全部監(jiān)控Redis中名為start_crawl的字符串,如果這個(gè)字符串不存在,或者為0,那么就等待1秒鐘,再繼續(xù)檢查。如果這個(gè)字符串為1,那么就開(kāi)始運(yùn)行。

代碼片段可以簡(jiǎn)寫(xiě)為:

 
 
 
 
  1. import time
  2. import redis
  3. client = redis.Redis()
  4. while client.get('start_crawl') != 1:
  5.     print('繼續(xù)等待')
  6.     time.sleep(1)

這樣做確實(shí)可以達(dá)到目的,不過(guò)每一個(gè)子線(xiàn)程都會(huì)頻繁檢查Redis。

實(shí)際上,在Python的多線(xiàn)程中,有一個(gè)Event模塊,天然就是用來(lái)實(shí)現(xiàn)這個(gè)目的的。

Event是一個(gè)能在多線(xiàn)程中共用的對(duì)象,一開(kāi)始它包含一個(gè)為False的信號(hào)標(biāo)志,一旦在任一一個(gè)線(xiàn)程里面把這個(gè)標(biāo)記改為T(mén)rue,那么所有的線(xiàn)程都會(huì)看到這個(gè)標(biāo)記變成了True。

我們通過(guò)一段代碼來(lái)說(shuō)明它的使用方法:

 
 
 
 
  1. import threading
  2. import time
  3. class spider(threading.Thread):
  4.     def __init__(self, n, event):
  5.         super().__init__()
  6.         self.n = n
  7.         self.event = event
  8.     def run(self):
  9.         print(f'第{self.n}號(hào)爬蟲(chóng)已就位!')
  10.         self.event.wait()
  11.         print(f'信號(hào)標(biāo)記變?yōu)門(mén)rue?。〉趝self.n}號(hào)爬蟲(chóng)開(kāi)始運(yùn)行')
  12. eve = threading.Event()
  13. for num in range(10):
  14.     crawler = spider(num, eve)
  15.     crawler.start()
  16. input('按下回車(chē)鍵,啟動(dòng)所有爬蟲(chóng)!')
  17. eve.set()
  18. time.sleep(10)

運(yùn)行效果如下圖所示:

在這段代碼中,線(xiàn)程spider在運(yùn)行以后,會(huì)運(yùn)行到self.event.wait()這一行,然后10個(gè)子線(xiàn)程會(huì)全部阻塞在這里。而這里的self.event,就是主線(xiàn)程中eve = threading.Event()生成的對(duì)象傳入進(jìn)去的。

在主線(xiàn)程里面,當(dāng)執(zhí)行了eve.set()后,所有子線(xiàn)程的阻塞會(huì)被同時(shí)解除,于是子線(xiàn)程就可以繼續(xù)運(yùn)行了。

本文轉(zhuǎn)載自微信公眾號(hào)「未聞Code」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系未聞Code公眾號(hào)。


分享題目:一日一技:Python多線(xiàn)程的事件監(jiān)控
URL鏈接:http://www.5511xx.com/article/ccdsscg.html