windows 上的 Pathos 多处理管道和队列
Pathos multiprocessing pipe and queue on windows
我正在尝试使用 pathos
库来替换内置多处理库,但在 windows 上使用管道或队列时遇到困难。这是一个代表性的例子:
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()
准确预测崩溃。
当 Wing IDE 设置为调试子进程时,问题就出现了。据我了解,wing 通过在父进程和子进程之间插入自身来启用子进程调试(这意味着 'child' 进程现在实际上是父进程的孙子进程)。在 windows 上,这可以通过 monkeypatching multiprocessing
使 Popen 在句柄上调用 duplicate()
时将 'inheritable' 标志设置为 True
来实现。
如果没有 inheritable
设置,孙进程将无法访问句柄,因此会引发上述异常。
似乎可以将类似的猴子补丁应用于 pathos
的 helpers.mp
模块,以允许 wing 使用 pathos
调试子进程。
我正在尝试使用 pathos
库来替换内置多处理库,但在 windows 上使用管道或队列时遇到困难。这是一个代表性的例子:
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()
准确预测崩溃。
当 Wing IDE 设置为调试子进程时,问题就出现了。据我了解,wing 通过在父进程和子进程之间插入自身来启用子进程调试(这意味着 'child' 进程现在实际上是父进程的孙子进程)。在 windows 上,这可以通过 monkeypatching multiprocessing
使 Popen 在句柄上调用 duplicate()
时将 'inheritable' 标志设置为 True
来实现。
如果没有 inheritable
设置,孙进程将无法访问句柄,因此会引发上述异常。
似乎可以将类似的猴子补丁应用于 pathos
的 helpers.mp
模块,以允许 wing 使用 pathos
调试子进程。