Pathos多处理管道和窗口上的队列

时间:2015-11-17 18:32:34

标签: python windows multiprocessing pathos

我正在尝试使用pathos库来替换内置的多处理库,但是在窗口上使用管道或队列时遇到了困难。这是一个有代表性的例子:

from pathos.helpers import mp
#import multiprocessing as mp

def f(pipe, queue):
    if sys.gettrace():
        print 'Debug mode. About to crash'
    else:
        print 'Execute mode'
    pipe.send('pipe')
    queue.put('queue')


if __name__ == '__main__':
    mp.freeze_support()

    to_child, to_self = mp.Pipe()
    queue = mp.Queue()
    p = mp.Process(target=f, args=(to_child, queue))
    p.start()
    p.join()

pipe.send('pipe')提升IOError: (6, 'The handle is invalid')queue.put('queue')加注WindowsError: [Error 5] Access is denied。两者都使用vanilla多处理模块正常工作。

我做错了吗?

修改: 这种崩溃只发生在我尝试调试子进程时(我使用WingIDE)。如上所述,我可以通过检查sys.gettrace()来准确预测崩溃。

1 个答案:

答案 0 :(得分:0)

事实证明,当Wing IDE设置为调试子进程时会出现问题。据我了解,wing通过在父进程和子进程之间插入自身来启用子进程调试(这意味着'子'进程现在实际上是父进程的孙子进程)。在Windows上,通过monkeypatching multiprocessing可以使Popen在句柄上调用True时将'inheritable'标志设置为duplicate()

如果没有inheritable设置,孙子进程就无法访问句柄,因此会引发上述异常。

似乎可以将类似的猴子补丁应用于pathos的{​​{1}}模块,以允许机翼使用helpers.mp调试子进程。