我编写了一个很好的并行作业处理器,它接受作业(函数,它们的参数,超时信息等),然后提交给Python multiprocessing池。如果需要,我可以提供完整的(长)代码,但关键步骤(我看到它)是池的异步应用程序:
job.resultGetter = self.pool.apply_async(
func = job.workFunction,
kwds = job.workFunctionKeywordArguments
)
我正在尝试将这个并行作业处理器与大量遗留代码一起使用,当然也许会遇到pickling个问题:
PicklingError: Can’t pickle <type ’instancemethod’>: attribute lookup builtin .instancemethod failed
当我尝试将有问题的对象作为工作函数的参数提交时,可以观察到这种类型的问题。真正的问题是这是遗留代码,我被告知我只能做很小的改动。那么......是否有一些聪明的技巧或简单的修改我可以在某处允许我的并行作业处理器代码来处理这些传统上不可解决的对象?我可以完全控制并行作业处理器代码,所以我愿意将每个提交的函数包装在另一个函数中。对于遗留代码,我应该能够偶尔为对象添加一个小方法,但这就是它。对这类问题有一些聪明的方法吗?
答案 0 :(得分:1)
使用dill
和pathos.multiprocessing
代替pickle
和multiprocessing
。
见这里: What can multiprocessing and dill do together?
http://matthewrocklin.com/blog/work/2013/12/05/Parallelism-and-Serialization/
How to pickle functions/classes defined in __main__ (python)