了更好地體驗多執行緒爬蟲,本章先介紹下需要了解的知識點,以便後續的多執行緒爬蟲文章有更好的理解與學習。
在接下來要講的知識點中,感興趣的讀者們請先弄清楚程序和執行緒兩者是什麼?它們各自有著什麼樣的關係呢?讀下廖雪峰老師簡單介紹的例子,比喻非常生動清晰,故這裡不多做講解。
程序和執行緒www.liaoxuefeng.com
看完後記住其中乙個觀念:程序是由若干執行緒組成的,乙個程序至少有乙個執行緒。(面試中常會問到的知識點)
經過上面的概念介紹,大家想兩個問題,為什麼在編寫**的過程中要使用多程序或者多執行緒?
世界上第一台計算機被美國國防部用來進行彈道計算。隨著時間消逝,到了 20 世紀 70 年代以後,微處理機的出現,使電子計算機的應用越來越廣泛。
同時,計算機本身的硬體也不斷的發生了變化,比如早年的家用計算機只能儲存 kb 單位的資料,而現在則可以儲存 tb 以上的資料。又比如,計算機的核心元件 cpu 從原來的單核變為了多核。
**處理器(cpu,central processing unit)是一塊超大規模的積體電路,是一台計算機的運算核心(core)和控制核心( control unit)。它的功能主要是解釋計算機指令以及處理計算機軟體中的資料。筆者現在用的這台 windows 電腦,如何檢視它的 cpu 核心數呢?
按下 win 鍵(在 alt 左邊) + r ,開啟執行視窗,輸入 cmd:
輸入 wmic,回車:
再輸入 cpu get *,回車:
拖拽滾動條,看到下圖:
有 2 個核心,而筆者的 cpu 型號是:
回到剛才提的問題中,不論是多執行緒還是多程序,最終的目的都是為了加快我們程式的執行速度,提高效率,節省時間。
假設有一家**鋪接到個訂單,要打造 10 件**。而打造**需要鐵匠,乙個冶煉車間可以容納 5 個鐵匠進行冶煉。乙個人打造一把**用時 1 天。模擬到計算機上, cpu 的核心數大家則可以想象成冶煉車間,有幾個核心則有幾個冶煉車間,執行緒數目可以想象**數(老闆與鐵匠)。
**鋪老闆(主線程)一共招收了 10 個鐵匠小弟(子執行緒),但是早期的時候只有乙個冶煉車間(cpu 核心數)。那麼打造 10 件**時,只能最多有 5 個人幹活。第一天前 5 個鐵匠幹活,第二天後 5 個鐵匠幹活。這樣加起來 10 把**則需要 2 天才能完成。(單核心,多個執行緒在單個核心上間歇執行)
後來呢,皇城下的王子(訂單主人)覺得**店效率太慢!這樣的效率不高,既然鐵匠有 10 個人,那再造一間冶煉車間就好了呀!所以投資新建了一間冶煉車間。於是過些時日,**店在接到打造 10 件**時,只用了 1 天,10 個鐵匠就打造了 10 把**。(多核心,多個執行緒在多個的核心上高效執行)
通過這個看似恰當又不恰當的例子,其實想說的就是現在的 cpu 多核心時代,多執行緒/程序 可以盡量的充分利用每個核心,從而達到高效率執行任務。
先來看看在 python 中多執行緒如何使用?以上面打**為例:
import
結果如下:
解釋下**,在 python 中,官方提供了乙個自帶的 threading 包,使用它可以來手動建立執行緒。
首先呼叫 run 函式,在 run 函式裡面,先獲取主線程的名字。然後**店老闆吆喝小弟 1 號開工。通過 threading.thread 建立乙個新的子執行緒並將其賦值為 t1,而這個子執行緒的任務是什麼呢?它的 target 引數指向要執行的函式,也就是 work。name引數是給子執行緒命名。
work 具體就是鐵匠小弟掄大錘,打造**。隨後回到 run 函式,使用 t1.start() 和 t1.join(),直至最終結束。這裡大家就要養成檢視官方文件的好習慣啦。開啟 python 中文官方文件,搜尋 thread,開啟後,可以看到相應的方法介紹。
start、join、name詳細介紹都在下方。
現在**鋪老闆只召喚了 1 個小弟,那麼在增加乙個小弟呢?只需要改動下**:
def
結果:
筆者執行此程式一共三次,不難發現,三次輸出的結果都是不一樣的。怎麼理解這個結果呢?
這就有點像搶冶煉車間的大喇叭,用來匯報自己的功勞,大家都喜歡搶功勞。假設現在鐵匠小弟掄錘子一下,就需要喊一聲:「我(比如是鐵匠 1 號)掄大錘xx次了!」 由於每個冶煉車間的大喇叭只有乙個,所以幾號小弟先搶到,幾號就能用喇叭喊出來!
在計算機中,每個執行緒都會去搶奪 cpu 的資源,誰搶到了,誰就可以「發聲」!所以有時候是鐵匠小弟 1 號先列印輸出,有時候是鐵匠小弟 2 號先列印輸出。
程序 vs. 執行緒www.liaoxuefeng.com
略微熟悉 python 多執行緒的同學,應該都聽說過「全域性鎖」的概念。正是這把"鎖",讓 python(cpython 直譯器下,有些 python 直譯器並沒有) 在多執行緒的情況下有了效率低下之說。具體的就不給大家解釋了,因為這把「鎖」不是一言兩語能說清楚的。。感興趣的可以自行搜尋。
python多執行緒 python多執行緒
通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...
python多執行緒詳解 Python多執行緒詳解
前言 由於最近的工作中一直需要用到python去處理資料,而在面對大量的資料時,python多執行緒的優勢就展現出來了。因而藉此機會,盡可能詳盡地來闡述python多執行緒。但對於其更底層的實現機制,在此不做深究,僅是對於之前的一知半解做個補充,也希望初學者能夠通過這篇文章,即便是照葫蘆畫瓢,也能夠...
python程式多執行緒 PYTHON多執行緒
在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...