悲刀只能使用游泳池吗?我正在考虑使用multiprocessing.queues解决pickle问题

时间:2016-03-09 15:53:39

标签: python multiprocessing pickle dill pathos

我正在尝试创建一系列具有特定作业的工作线程。当前是从队列中抽取,进行一些处理,并将输出放在第二个队列中。

当我尝试使用多处理(多进程?有什么区别?)模块时,我遇到以下问题

Traceback (most recent call last):
  File "C:\Python27\lib\multiprocessing\queues.py", line 264, in _feed
    send(obj)
PicklingError: Can't pickle <type 'function'>: attribute lookup     __builtin__.function failed

这似乎是某种形式的问题。我正在处理__getattr__被覆盖的对象,但我确实使用了

if name.startswith('__') and name.endswith('__'):
        return object.__getattr__(name)

确保不再调用TypeError。多处理的酸洗问题的答案是使用pathos,但我没有看到pathos中访问任何类型队列的方法。我也没有看到在Process中生成pathos的方法。我见过的每个例子都使用pool。我还看到了pathos.helpers.mp.process.Process的回复,但是找不到我的模块 - 例如ImportError: cannot import name helpers。这有可能吗?

1 个答案:

答案 0 :(得分:1)

我是pathos作者。是的,您可以使用Process中的pathos,但是,如果这是您感兴趣的内容,则可能更容易使用multiprocess。一些消除歧义:multiprocessmultiprocessing的分支,其中分支用pickle替换dill - 并且没有其他更改。 pathos,然后在multiprocess之上添加一个额外的图层,主要在Pool个对象上。 pathos.multiprocessingmultiprocess之上的附加图层...如果您希望从multiprocess直接访问pathos,则可以获取它。参见:

>>> import pathos
>>> pathos.helpers.mp.Process
<class 'multiprocess.process.Process'>
>>> 
>>> import multiprocess as mp
>>> mp.Process
<class 'multiprocess.process.Process'>
>>>