代碼:
from multiprocessing import Pool
p = Pool(5)
p.map(download_file, file_lists)
錯誤信息:
multiprocessing.pool.MaybeEncodingError: Error sending result: 'HTTPError()'. Reason: 'PicklingError("Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed",)'
在網上搜索到三種方法:
1.用線程替換進程
2.可以使用copy_reg來規避上面的異常.
3.dill 或pathos.multiprocesssing :use 'import pathos.multiprocesssing', instead of 'import multiprocessing'. pathos.multiprocessing is a fork of multiprocessing that uses dill. dill can serialize almost anything in python, so you are able to send a lot more around in parallel.
最開始採用了方法3:use 'import pathos.multiprocesssing', instead of 'import multiprocessing' ,然後程序並不在拋出該錯誤,但是啓動case後,appium啓動driver後便不在幹活(使用兩個進程分別在不同端口啓動driver),appium log沒有錯誤,pycharm也一直轉轉轉卡在那不去執行find element, 所以還是還原到使用import multiprocessing
最終解決方案如下:
1. mac裡面的python都刪乾淨
2. 用pyenv裝python 3.5.2
3. 執行multi process case script
4. 把該裝的selenium, Pillow, requests裝一裝
5. 最後一步降級appium-python-client : pip install appium-python-client==0.25 (這個是重點,可以忽略其他步驟直接降級版本,這裏是因爲需要才重裝, 當然筆者local的0.31版本也可以的,就是最新版(0.43)有問題)
6. 成功!