線程、進程和協程的詳細概念解釋和原理剖析不是本文的重點,本文重點講述在Python中怎樣實際使用這三種東西python
參考: 進程、線程、協程之概念理解shell
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操做系統結構的基礎。
線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。
協程:一個程序能夠包含多個協程,能夠對比於一個進程包含多個線程,於是下面咱們來比較協程和線程:咱們知道多個線程相對獨立,有本身的上下文,切換受系統控制;而協程也相對獨立,有本身的上下文,可是其切換由本身控制,由當前協程切換到其餘協程由當前協程來控制。編程
磨刀不誤砍柴工,在用實例講解線程、進程和協程怎麼使用以前,先準備一些工具:session
實際上多線程、多進程和協程,都屬於併發編程,併發編程的最重要的目標就是提升程序運行的效率,那麼咱們須要一個計算一個函數耗時長度的工具,用於對比不一樣方式程序的運行時間,這裏咱們寫一個函數計時裝飾器fn_timer來完成這件事:多線程
該裝飾器的用法示例:併發
運行代碼輸出:app
實際使用中,大規模爬蟲程序很適合用併發來實現,因此咱們再準備一些網址放在urls列表中,用於測試爬蟲程序的效率(都是百度百科的一些詞條頁面):dom
整合:把函數計時裝飾器和urls列表封裝在一個類:utils.py中:異步
從聽音樂、看電影講起socket
我如今要作兩件事情:聽音樂、看電影,聽一首音樂假如耗時1秒,看一部電影假如耗時5秒,用兩個函數定義這兩個任務以下:
假如我如今要聽10首音樂、看2部電影,那麼我就有以下幾種方案:
方案一:先一個個聽完10首音樂,再一個個看完2部電影,順序完成,代碼以下:
讓咱們執行一下這段代碼,輸出以下:
能夠看到,老老實實嚴格按照前後順序來一件件作這些事情,所需的總時間和每件事情耗時加起來是同樣多的。
方案二:剛剛的方案不太好,太費時間了,那麼能不能同時進行一些事情呢?答案是能夠的,能夠同時聽多首音樂,同時看多部電影進行,代碼以下:
執行上述代碼,運行結果:
此次只用了5秒就完成了,完成效率顯著提高。此次試用多線程執行多個任務,全部任務最終的總耗時 = 耗時最長的那個單個任務的耗時,即看一部電影的5秒鐘時間。
方案三:使用線程池。上面使用多線程的方式比較繁瑣,下面使用線程池來實現:
執行結果:
能夠看出使用線程池反而比手工調度線程多耗時一秒鐘,多是由於線程池內部對線程的調度和線程切換的耗時形成的。
實例:使用多線程下載網頁
話很少說,直接上代碼,用多線程併發下載20個百度百科網頁的實例代碼及運行結果以下:
多進程和進程池的使用
實例代碼以下:
進程之間的通訊
進程間的通訊採用隊列來實現,實例代碼以下:
下面用協程下載一樣的20個網頁,實例代碼以下:
能夠發現,協程的效率也是很是高的。
下面分別使用線程池、進程池和協程池下載100個相同的網頁,來對比其效率:
從結果來看,使用協程池的效率仍是略高一點。
做者:m2fox
連接:https://www.jianshu.com/p/857e0780946b