解決python多執行緒報錯:AttributeError: Can't pickle local object問題
阿新 • • 發佈:2020-04-09
報錯資訊:
Traceback (most recent call last):
File “D:/flaskProject/test.py”,line 35,in test
pool.apply(self.out,args=(i,))
File “Python37-32\lib\multiprocessing\pool.py",line 261,in apply
return self.apply_async(func,args,kwds).get()
File "\lib\multiprocessing\pool.py”,line 657,in get
raise self._value
File “\Python37-32\lib\multiprocessing\pool.py",line 431,in _handle_tasksput(task)
File "\Python37-32\lib\multiprocessing\connection.py”,line 206,in send
self._send_bytes(_ForkingPickler.dumps(obj))
File “*\Python37-32\lib\multiprocessing\reduction.py”,line 51,in dumps
cls(buf,protocol).dump(obj)
TypeError: can't pickle _thread._local objects
原類的建構函式:
class threadtest: def __init__(self,ipList,user,password): self.ipList = ipList self.httpAuth = HTTPDigestAuth(user,password) return def out(self,i): url = "http://" + i + "/name" response = requests.get(url,self.httpAuth) print(response.text) return def test(self): pool = Pool(processes=2) for i in self.ipList: pool.apply(self.out,)) pool.close() pool.join() return
if name == ‘main': ipList = [‘192.168.2.1',‘192.168.2.2',‘192.168.2.3',‘192.168.2.4',‘192.168.2.5',] a = threadtest(ipList,‘admin',‘admin') a.test()
原因:
在class中對屬性進行初始化使用了其它類返回的控制代碼進行初始化導致,HTTPDigestAuth的返回值不能進行序列化,也就是不能作為cls(buf,protocol).dump(obj)的引數進行序列化。
將self.httpAuth = HTTPDigestAuth(httpUser,httpPassword)修改為:
self.httpUser
self.httpPassword
並將函式HTTPDigestAuth放到類的方法中
修改後:
class threadtest: def __init__(self,password): self.ipList = ipList self.user = user self.password = password return def out(self,HTTPDigestAuth(self.user,self.password)) print(response.text) return def test(self): pool = Pool(processes=2) for i in self.ipList: pool.apply(self.out,‘admin') a.test()
以上這篇解決python多執行緒報錯:AttributeError: Can't pickle local object問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。