您好,登錄后才能下訂單哦!
小編給大家分享一下python爬蟲中多線程和多進程的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
Python是一種跨平臺的、具有解釋性、編譯性、互動性和面向對象的腳本語言,其最初的設計是用于編寫自動化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發獨立的項目和大型項目。
一、進程/線程
表示可以同時執行多個任務,進程和線程的調度是由操作系統自動完成。
1、進程:是線程的集合,是由一個或多個線程構成的。
每個進程都有自己獨立的內存空間,不同進程之間的內存空間不共享。
進程之間的通信有操作系統傳遞,導致通訊效率低,切換開銷大。
2、線程:是操作系統進行運算調度的最小單位,是進程中的一個最小運行單元。
一個個進程可以有多個線程,所有線程共享進程的內存空間,通訊效率高,切換開銷小。
二、多進程/多線程
1、多進程
進程的調度:當有多個進程并行執行時,每個進程得到的時間片的時間不一樣,哪個進程接受哪個請求以及執行完成的時間都是不定的,所以不處理的話會輸出亂序。
python中多進程用到的模塊是multiprocessing(python就是模塊多…一些基本的,常用的都已經有模塊了……),multiprocessing[下面簡稱mp]的很大的一部分與threading模塊使用同一套API
進程池:Pool【感覺已經是mp的高級用法了】,可以提供指定數量的進程供用戶調用,每當有請求提交到Pool的時候,如果進程池還沒有滿,就會創建一個新的進程來執行請求,如果進程滿了,則請求將會被告知先等待,直至進程池中有進程結束才會放入,以執行請求。
簡單來說,就是進程池可創建多個進程,這些進程就像是隨時待命的士兵,準備執行任務。
2、多線程
不依賴CPU的操作我們是可以通過使用多線程來大大提高程序的效率。
Python一般通過threading庫來實現多線程。threading庫是對thread庫進行包裝后的產物。
指同一時刻只能有一條指令執行,但多個線程的對應的指令被快速輪換地執行,宏觀上看起來多個線程在同時運行,但微觀上只是這個處理器在連續不斷地、在多個線程之間切換和執行。
指同一時刻有多條指令在多個處理器上同時執行,并行必須要依賴于多個處理器,不論宏觀上還是微觀上,多個線程都是在同一時刻一起執行的。
GIL 全局解釋器鎖:線程的執行權限,在Python的進程里只有一個GIL。一個線程需要執行任務,必須獲取GIL。
好處:直接杜絕了多個線程訪問內存空間的安全問題。
壞處:Python的多線程不是真正多線程,不能充分利用多核CPU的資源。但是,在I/O阻塞的時候,解釋器會釋放GIL。
線程實現
1)通過繼承threading當中的Thread類
2)然后再init里調用Thread的init方法(或者用super調用超類的構造函數),就可以完成對一個線程的初始化創建工作。
3)然后我們可以通過重寫類的run方法來定義這個線程的要做的事。
4)創建一個這個類的對象。
5)然后調用這個對象的start方法就讓這個線程開始工作了。
6)調用對象的join方法等待這個線程結束工作
三、總結
1、多進程:
密集CPU任務,需要充分使用多核CPU資源(服務器,大量的并行計算)的時候,用多進程。
想要提高執行效率,大部分開發者是通過編寫多進程來提高運行效率,使用multiprocessing進行并行編程。
缺陷:
每個進程都會有自己的內存,數據多的話,內存會吃不消。
多個進程之間通信成本高,切換開銷大。
2、多線程:
密集I/O任務(網絡I/O,磁盤I/O,數據庫I/O)使用多線程合適。
多線程是為了同步完成多項任務,通過提高資源使用效率來提高系統的效率。線程是在同一時間需要完成多項任務的時候實現的。
缺陷:
在編寫多線程代碼時候,要注意死鎖的問題、阻塞的問題、以及需要注意多線程之間通信的問題(避免多個線程執行同一個任務)。
同一個時間切片只能運行一個線程,不能做到高并行,但是可以做到高并發。
看完了這篇文章,相信你對“python爬蟲中多線程和多進程的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。