2015-01-13 101 views
4

我有以下代码test.py:多包在交互式Python

#multiprocessing in the interactive Python 

import time 
from multiprocessing import Process, Pipe 

def MyProcess(a): 

    while(1): 
     time.sleep(1) 
     a.send("tic")  

if __name__ == "__main__": 

    a, b = Pipe() 

    p = Process(target=MyProcess, args=(a,)) 
    p.start() 

    while(1): 
     msg=b.recv() 
     print(msg) 

,如果我在DOS下执行它壳“蟒蛇test.py” 它工作正常,但它不一样,如果我的工作使用IEP(Pyzo)的“Execute File”(执行文件)。

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\pyzo2014a_64b\lib\multiprocessing\spawn.py", line 106, in spawn_main 
    exitcode = _main(fd) 
    File "C:\pyzo2014a_64b\lib\multiprocessing\spawn.py", line 116, in _main 
    self = pickle.load(from_parent) 
AttributeError: Can't get attribute 'MyProcess' on <module '__main__' (built-in)> 

我发现这是一个记录在案的“问题”。请检查以下链接的答案。

multiprocessing breaks in interactive mode

这是否意味着我不应该从交互式Python使用多包?这是否意味着我无法从IPython控制台创建进程? 任何对此的澄清将高度赞赏

回答

3

正确的,你不能使用multiprocessing从解释...主要是因为pickle不知道如何序列化互动功能。但是,如果您使用名为pathos.multiprocessingmultiprocessing分支,则可以从解释器执行所需操作。这是有效的,因为pathos.multiprocessing使用dilldill知道如何序列化解释器中定义的函数(和其他对象)。

>>> from pathos.multiprocessing import ProcessingPool as Pool 
>>> 
>>> p = Pool(4) 
>>> def squared(x): 
... return x**2 
... 
>>> def pow(x,y): 
... return x**y 
... 
>>> a = range(10) 
>>> b = range(10,0,-1) 
>>> 
>>> p.map(squared, a) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 
>>> res = p.amap(pow, a, b) 
>>> print "asynchronous, and with multiple inputs!" 
asynchronous, and with multiple inputs! 
>>> res.get() 
[0, 1, 256, 2187, 4096, 3125, 1296, 343, 64, 9] 

获取pathos这里:https://github.com/uqfoundation

+0

一个新的'pathos'发布是迫在眉睫。现有的稳定版本比较老,并且早于'pip',但是用'setuptools'平均安装。 –

+0

谢谢Mike, 我会带走一些感受,并会报告。 –