当使用multiprocessing.Pool
类同时执行一个函数时,我一直遇到问题。我在Windows 10上使用Python 3.8.3和PyCharm 2017.3。
我正在执行的功能是打开硬盘上的excel文件,并将其串行化为自定义对象,我想稍后对其进行迭代。错误总是发生在函数的最后一次执行之后。上面写着:
multiprocessing.pool.MaybeEncodingError: Error sending result: '[<IntegListe.IntegrityList object at 0x037481F0>, <IntegListe.IntegrityList object at 0x03D86CE8>, <IntegListe.IntegrityList object at 0x03F50F88>]'. Reason: 'TypeError("cannot pickle '_thread.RLock' object")'
以下是我的代码:
from multiprocessing import Pool
p = Pool()
ilList = p.starmap(extract_excel, [(f, spaltennamen) for f in files])
p.join()
p.close()
这就是我试图并行执行的函数:
def extract_excel(t: tuple) -> IntegrityList:
file_path = t[0]
spaltennamen = t[1]
il = IntegrityList(file_path)
print(il)
spaltennamen = list(map(lambda x: Excel.HereOrFind(il.ws, x, x.value), spaltennamen)) # Update position of column headers
il.parse_columns(spaltennamen, il.ws)
il.close()
return il
由于我是python的新手,所以我很难弄清楚这个多处理错误背后的魔力。串行执行函数非常好,我得到了所需的输出。这证明了函数和所有子函数都按预期工作。如果能提供任何有助于解决这个问题的信息,我将不胜感激。谢谢
好的,所以对于未来的问题查看器,我在这个网站的帮助下解决了这个错误:https://www.synopsys.com/blogs/software-security/python-pickling/#:~:text=每当%20an%20object%20被%20抓取时,在%20取消抓取时重新构建%20this%20object@20。。
它指出,每个经过并行过程的定制对象都需要实现__reduce__
方法才能进行重建。
我只是简单地将此代码添加到我的自定义对象:
def __reduce__(self):
return IntegrityList, (self.file_path,)
在那之后,并行处理的执行非常有效。