1. 首先看一下 python 多進程的優點和缺點
多進程優點: 1.穩定性好: 多進程的優點是穩定性好,一個子進程崩潰了,不會影響主進程以及其余進程。基於這個特性,常常會用多進程來實現守護服務器的功能。 然而多線程不足之處在於,任何一個線程崩潰都可能造成整個進程的崩潰,因為它們共享了進程的內存資源池。 2.能充分利用多核cpu: 由於python設計之初,沒預料到多核cpu能夠得到現在的發展,只考慮到了單核cpu。為了更好的實現多線程之間數據完整性與狀態同步, 於是設計出了一個全局解析器鎖(GIL, global interpreter lock)。 GIL確保Python進程一次運行一個線程(其它線程處於等待I/O或者睡眠狀態),無論當前cpu有多少核心。這就意味着Python雖然可以實現多線程, 但是在任意時間點僅有一個核心在執行Python指令(即線程無法並行運算),無法發揮現代多核cpu的性能。而多進程可以利用多核cpu。 多進程缺點: 1. 創建進程的代價非常大: 因為操作系統要給每個進程分配固定的資源,並且操作系統對進程的總數會有一定的限制,若進程過多,操作系統調度都會存在問題,會造成假死狀態。 2. 進程間通信成本高: 每個進程都有自己獨立的內存空間,不同進程之間的內存空間不共享。進程之間的通信有操作系統傳遞,導致通訊效率低,切換開銷大。 通信主要通過信號傳遞的方式來實現(實現方式有多種,信號量、管道、事件等,通訊都需要過內核,效率低) 3. 切換開銷大: 上下文切換的時候需要保存棧、cpu寄存器、虛擬內存、以及打開的相關句柄等信息,開銷大。
4. 耗內存: python 使用multiprocessing來創建多進程時,無論數據是否不會被更改,子進程都會復制父進程的狀態(內存空間數據等)。
如果主進程耗的資源較多時,不小心就會造成不必要的大量的內存復制,從而可能導致內存爆滿的情況。
二: 測試服務器情況:
cpu是12核心,內存是128G
三:測試目的:
測試目的是因為多進程 切換開銷大,創建進程的代價大,通過開不同的進程數量,測試是否會出現進程開的越多,爬蟲的速度越慢的情況。
四:測試軟件條件:
1. 用10000個關鍵詞,去爬取微博的搜索接口,通過開不同的進程數據,評估爬蟲耗時情況。
五: 測試過程:
2 .開32個多進程爬蟲耗時情況:
程序耗時:
3 .開64個多進程爬蟲耗時情況:
程序耗時:
4 .開128個多進程爬蟲耗時情況:
程序耗時:
5 .開256個多進程爬蟲耗時情況:
程序耗時:
6 .開512個多進程爬蟲耗時情況:
程序耗時:
7 .開768個多進程爬蟲耗時情況:
程序耗時:
8 .開1024個多進程爬蟲耗時情況:
程序耗時:
六. 數據統計分析:
七. 結論:多進程數據量在512一下,對程序的提速還是很明顯,因為多進程耗內存,所以注意內存的優化。