我知道在Mac和Windows上python的multiprocessing
的方式有所不同;例如:
这些帖子似乎暗示问题在于如何腌制不在其模块中的功能,尽管this answer更为具体,并指出问题与绑定方法。
在Windows上,我可以启动Jupyter Notebook,并在其中定义我定义的功能:
import pickle
def test(): return None
pickle.dumps(test)
并返回b'\x80\x03c__main__\nt\nq\x00.'
(正如预期的那样,这也可以直接在标准的交互式python会话中使用)。
但是,将其包装在多处理器调用中确实会产生错误(在笔记本和终端中):
> import multiprocessing as mp
> def test(): return None
> p = mp.Pool(processes=2)
> p.map(test, range(2))
AttributeError: Can't get attribute 'test' on <module '__main__' (built-in)>
这在Mac上的交互式会话中确实有效(尽管交互式定义的函数需要一个参数来防止出现TypeError: test() takes 0 positional arguments but 1 was given.
错误)
这必须表示我不完全了解多处理的作用-我以为这只是对对象进行酸洗,但是鉴于我可以对笔记本中定义的对象进行酸洗,因此多处理必须做的还不止这些。有人可以填补我的理解空白吗?!