高效能非同步爬蟲
阿新 • • 發佈:2020-07-28
高效能非同步爬蟲
目的:在爬蟲中使用非同步實現高效能的資料爬取操作。
非同步爬蟲的方式:
- 多執行緒、多程序(不建議):
- 好處:可以為相關阻塞的阻塞單獨開啟執行緒或者程序,阻塞操作就可以非同步執行。
- 弊端:無法無限制的開啟多執行緒或者多程序。
- 執行緒池、程序池(適當使用):
- 好處:可以降系統對程序或者執行緒建立和銷燬的一個頻率,從而很好的降低系統的開銷。
- 弊端:池中執行緒或者程序的數量是有限的。
- 單執行緒+非同步協程(推薦):
event_loop:事件迴圈,相當於一個無限迴圈,我們可以把一些函式註冊到這個事件迴圈上,當滿足某些條件的時候,
函式就會被迴圈執行。程式是按照設定的順序從頭執行到尾,執行的次數也是完全按照設定。
當在編寫非同步程式時,必然其中有部分程式的執行耗時是比較久的,需要先讓出當前程式的控制權,
讓其在背後執行,讓另一部分的程式先執行起來。當背後執行的程式完成後,
也需要及時通知主程式已經完成任務可以進行下一步操作,但這個過程所需的時間是不確定的,
需要主程式不斷的監聽狀態,一旦收到了任務完成的訊息,就開始進行下一步。loop就是這個持續不斷的監視器。
coroutine:中文翻譯叫協程,在 Python 中常指代為協程物件型別,我們可以將協程物件註冊到事件迴圈中,
它會被事件迴圈呼叫。我們可以使用 async 關鍵字來定義一個方法,這個方法在呼叫時不會立即被執行,
而是返回一個協程物件。
task:任務,它是對協程物件的進一步封裝,包含了任務的各個狀態。
future:代表將來執行或還沒有執行的任務,實際上和 task 沒有本質區別。
async:定義一個協程。
await:用來掛起阻塞方法的執行。