multiprocessing.pool.MaybeEncodingError: Error sending result occurs at last object

multiprocessing.pool.MaybeEncodingError: Error sending result occurs at last object

我在使用 multiprocessing.Pool class 一次多次执行函数时一直遇到问题。 我在 Windows 10 和 PyCharm 2017.3.

上使用 Python 3.8.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=Whenever%20an%20object%20is%20pickled,reconstruct%20this%20object%20when%20unpickling.

它声明每个经过并行处理的自定义对象都需要实现 __reduce__ 方法才能被重构。

我只是将这段代码添加到我的自定义对象中:

def __reduce__(self):
    return IntegrityList, (self.file_path,) 

之后并行处理的执行效果很好。