1. 程式人生 > >Python多程序協程爬蟲----1

Python多程序協程爬蟲----1

考慮到CPU和IO之間巨大的速度差異,一個任務在執行的過程中大部分時間都在等待IO操作,單程序單執行緒模型會導致別的任務無法並行執行,因此,我們才需要多程序模型或者多執行緒模型來支援多工併發執行。

現代作業系統對IO操作已經做了巨大的改進,最大的特點就是支援非同步IO。如果充分利用作業系統提供的非同步IO支援,就可以用單程序單執行緒模型來執行多工,這種全新的模型稱為事件驅動模型,Nginx就是支援非同步IO的Web伺服器,它在單核CPU上採用單程序模型就可以高效地支援多工。在多核CPU上,可以執行多個程序(數量與CPU核心數相同),充分利用多核CPU。由於系統總的程序數量十分有限,因此作業系統排程非常高效。用非同步IO程式設計模型來實現多工是一個主要的趨勢。

對應到Python語言,單執行緒的非同步程式設計模型稱為協程,有了協程的支援,就可以基於事件驅動編寫高效的多工程式。

一、協程

注意到consumer函式是一個generator,把一個consumer傳入produce後:

  1. 首先呼叫c.send(None)啟動生成器;

  2. 然後,一旦生產了東西,通過c.send(n)切換到consumer執行;

  3. consumer通過yield拿到訊息,處理,又通過yield把結果傳回;

  4. produce拿到consumer處理的結果,繼續生產下一條訊息;

  5. produce決定不生產了,通過c.close()關閉consumer,整個過程結束。

整個流程無鎖,由一個執行緒執行,produce

consumer協作完成任務,所以稱為“協程”,而非執行緒的搶佔式多工。

最後套用Donald Knuth的一句話總結協程的特點:

“子程式就是協程的一種特例。”

但是Python的yield不但可以返回一個值,它還可以接收呼叫者發出的引數。”                                                                               ---------------廖雪峰

二、asynicio