Python多程序協程爬蟲----1
阿新 • • 發佈:2019-01-25
考慮到CPU和IO之間巨大的速度差異,一個任務在執行的過程中大部分時間都在等待IO操作,單程序單執行緒模型會導致別的任務無法並行執行,因此,我們才需要多程序模型或者多執行緒模型來支援多工併發執行。
現代作業系統對IO操作已經做了巨大的改進,最大的特點就是支援非同步IO。如果充分利用作業系統提供的非同步IO支援,就可以用單程序單執行緒模型來執行多工,這種全新的模型稱為事件驅動模型,Nginx就是支援非同步IO的Web伺服器,它在單核CPU上採用單程序模型就可以高效地支援多工。在多核CPU上,可以執行多個程序(數量與CPU核心數相同),充分利用多核CPU。由於系統總的程序數量十分有限,因此作業系統排程非常高效。用非同步IO程式設計模型來實現多工是一個主要的趨勢。
一、協程
注意到consumer
函式是一個generator
,把一個consumer
傳入produce
後:
-
首先呼叫
c.send(None)
啟動生成器; -
然後,一旦生產了東西,通過
c.send(n)
切換到consumer
執行; -
consumer
通過yield
拿到訊息,處理,又通過yield
把結果傳回; -
produce
拿到consumer
處理的結果,繼續生產下一條訊息; -
produce
決定不生產了,通過c.close()
關閉consumer
,整個過程結束。
整個流程無鎖,由一個執行緒執行,produce
consumer
協作完成任務,所以稱為“協程”,而非執行緒的搶佔式多工。
最後套用Donald Knuth的一句話總結協程的特點:
“子程式就是協程的一種特例。”
“但是Python的yield不但可以返回一個值,它還可以接收呼叫者發出的引數。” ---------------廖雪峰二、asynicio