日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

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

設(shè)想這樣一個場景:

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

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

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

代碼片段可以簡寫為:

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

這樣做確實可以達到目的,不過每一個子線程都會頻繁檢查Redis。

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

Event是一個能在多線程中共用的對象,一開始它包含一個為False的信號標志,一旦在任一一個線程里面把這個標記改為True,那么所有的線程都會看到這個標記變成了True。

我們通過一段代碼來說明它的使用方法:

 
 
 
 
  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}號爬蟲已就位!')
  10.         self.event.wait()
  11.         print(f'信號標記變?yōu)門rue!!第{self.n}號爬蟲開始運行')
  12. eve = threading.Event()
  13. for num in range(10):
  14.     crawler = spider(num, eve)
  15.     crawler.start()
  16. input('按下回車鍵,啟動所有爬蟲!')
  17. eve.set()
  18. time.sleep(10)

運行效果如下圖所示:

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

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

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


文章名稱:一日一技:Python多線程的事件監(jiān)控
分享路徑:http://www.dlmjj.cn/article/ccdsscg.html