自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一日一技:Python多線程的事件監(jiān)控

開發(fā) 后端
設(shè)想這樣一個(gè)場(chǎng)景:你創(chuàng)建了10個(gè)子線程,每個(gè)子線程分別爬一個(gè)網(wǎng)站,一開始所有子線程都是阻塞等待。

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

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

[[391226]]

 

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

代碼片段可以簡寫為:

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

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

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

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

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

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

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

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

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

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

 

責(zé)任編輯:趙寧寧 來源: 未聞Code
相關(guān)推薦

2024-11-13 09:18:09

2021-04-12 21:19:01

PythonMakefile項(xiàng)目

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2021-03-12 21:19:15

Python鏈?zhǔn)?/a>調(diào)用

2024-07-30 08:11:16

2024-07-30 08:16:18

Python代碼工具

2021-09-13 20:38:47

Python鏈?zhǔn)?/a>調(diào)用

2021-07-27 21:32:57

Python 延遲調(diào)用

2021-10-15 21:08:31

PandasExcel對(duì)象

2022-06-28 09:31:44

LinuxmacOS系統(tǒng)

2022-03-12 20:38:14

網(wǎng)頁Python測(cè)試

2023-10-29 09:16:49

代碼安全命令

2020-05-19 13:55:38

Python加密密碼

2024-02-20 22:13:48

Python項(xiàng)目Java

2021-04-23 21:40:33

Python優(yōu)先級(jí)調(diào)度器

2023-10-28 12:14:35

爬蟲JavaScriptObject

2021-04-19 23:29:44

MakefilemacOSLinux

2021-06-01 21:24:44

多線程代碼搜索

2024-11-11 00:38:13

Mypy靜態(tài)類型

2021-10-03 20:08:29

HTTP2Scrapy
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)