查了下,原因是python无法使用apply_async传递class function,错误代码如下:
import multiprocessing as mp
class Foo():
@staticmethod
def work(self):
pass
if __name__ == '__main__':
pool = mp.Pool()
foo = Foo()
pool.apply_async(foo.work)
pool.close()
pool.join()
原因是因为 pool 方法使用mp.SimpleQueue 传递任务到工作进程,所以所有传递的参数都必须是picklable的。foo.work是unpicklable的,因为它并没有定义在模块的最上方而是在类的内部。
解决方式方式:apply_async的上方创建一个新的function,apply_async内调用该function,且在这个新的function内部调用foo.work():
def work(foo):
foo.work()
pool.apply_async(work,args=(foo,))
可以被pickle的类型:https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled