1. 程式人生 > 程式設計 >解決python多執行緒報錯:AttributeError: Can't pickle local object問題

解決python多執行緒報錯:AttributeError: Can't pickle local object問題

報錯資訊:

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_tasks

put(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問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。