概述
在開始看這篇文章之前,非常建議大家先熟悉個別的技術: 非同步技術以及多執行緒網頁爬取技術。以下,我想針對「他們的差別」以及在「多執行緒的技術理解焦點」兩個部分進行簡單的說明。
首先,關注到他們的差別。所謂的非同步技術,指得是我們每發出一個requests都要等待server端的回應,而非同步技術可以充分利用這個等待時間,同時再發出其他requests,直到server成功回應時,才開始用同一個執行緒出處理回應回來的資料。必須注意的是,他並不會占用到多的CPU核心數,只是充分利用在同一個核心上的運算量而已。承接著,上面這段解釋,大家應該很好想像,多執行緒在做的實情,無非就是,使用多個CPU核心去處理事情,這邊要比較注意的是,假設你的CPU核心不夠,硬是將執行緒的數量開的比核心數多,將可能會被強制終止某些執行緒。
再來,必須關注到「多執行緒的技術理解焦點」,如果還沒碰過這個技術,大家可以看完這一段落之後再開始學習多執行緒,相信會大有幫助。我想大家在理解這個技術的時候,可以先建一個手動的多執行緒,也就是把一個要跑回圈的data list,拆成三段或四段,在不同的terminal針對每一段data list執行同一支的程式。在這過程中,你會關注到一些麻煩,像是要怎麼裁切data list、或者裁切了之後會不會有些執行緒很快執行完,有些執行緒則處理很久。
因此,在面臨到這些狀況時,python內建了一個非常方便的類別queue,這個queue跟list很像,除了使用上有一些小差異之外(list的append、queue用put,list的讀取一般用for迴圈,queue則直接使用get配上while迴圈)。其中最大的差別在,list使用for迴圈可以被重複使用,
但是queue中的data只要get出來之後,就會從queue裡面消失。而也正是因為這個特性,上多執行緒在取出queue的data的時候,完全不用煩惱前一個執行緒執行到哪,也不需要等待執行完才能執行下一個data,只要持續地從queue取出要處理的data即可,直到取完最後一個queue中的data。如此來上述問題也就被解決了。
專案
- 說明: 這個專案中的每一個執行緒,將先上Bing檢索一間公司的公司名稱,然後透過非同步技術對Bing回應的第一頁的所有連結送出requests,並將美個網頁中的純文字取出,最後將所頁面的純文字寫入同一份純文字檔案。
- 原始碼專案: Github Repository
- 建議: 使用虛擬環境,在clone下整個專案之後,在專案的資料夾目錄中打開terminal,執行以下指令12345pip install virtualenvvirtualenv venvvenv\Scripts\activatepip install -r requirements.txtpython MultiAsync.py
主要程式碼
|
|