1. 程式人生 > >python的multiprocessing模組踩坑記錄

python的multiprocessing模組踩坑記錄

前言

最近做多程序多IP爬蟲,用到的multiprocessing模組有點坑,這裡總結一下,python版本是3.6

 

踩坑記錄

1、multiprocessing模組的子程序是不會複製父程序的資料的,這和fork函式不一樣,子程序中不會有父程序中的變數,如果子程序執行的函式所需要的引數比較多,並且會有一系列函式巢狀呼叫,建議把子程序需要呼叫的全部函式與變數封裝成一個類,直接將類的例項傳遞給子程序即可,例如:

class crawler:
     
    一系列屬性
    一系列函式

    def run(self):
        主體函式

cr=crawler(.......一系列屬性的初始值)
pool = multiprocessing.Pool(10) 
for i in range(0,10):
    pool.apply_async(crawler.run,(cr,))

      

這種形式需要注意是不是有臨界資源存在,若有,記得在使用前上鎖

 

2、子程序丟擲的異常不會自動輸出到控制檯,需要我們自己捕獲異常,輸出到控制檯或是日誌

 

3、部分IDE對multiprocessing不是很支援,建議使用命令列直接執行對應python指令碼

 

另外,本次爬蟲的多IP不是指使用代理,而是通過DNS解析獲得網站在不同地區的伺服器IP地址,將域名直接改為IP地址,並在http請求頭新增host欄位,自己在處理京東時,發現使用https協議時,即使添加了host欄位,京東的主機還是不認請求,改為http即可使用,這個有點神奇