2012-09-17 33 views
4

以下代码在Unix上完美工作,但在Windows 7上生成multiprocessing.TimeoutError(两个操作系统都使用python 2.7)。Python的多处理map_async在Windows上生成错误

任何想法为什么?谢谢。

from multiprocessing import Pool 

def increment(x): 
    return x + 1 

def decrement(x): 
    return x - 1 

pool = Pool(processes=2) 
res1 = pool.map_async(increment, range(10)) 
res2 = pool.map_async(decrement, range(10)) 

print res1.get(timeout=1) 
print res2.get(timeout=1) 
+0

会发生什么事,如果你增加超时值? –

+0

@罗兰史密斯:没什么。即使10秒,它仍然不起作用。 –

回答

1

你需要把你的实际程序逻辑放在一个if __name__ == '__main__':块中。

在Unixy系统上,Python分叉,生成多个进程以供工作。 Windows没有分叉。 Python必须启动一个新的解释器,然后重新导入所有的模块。这意味着每个子进程将重新导入你的主模块。对于您编写的代码重新导入模块将导致每个新启动的进程启动它自己的进程。

参见:http://docs.python.org/library/multiprocessing.html#windows

编辑这个工作对我来说:

from multiprocessing import Pool 

def increment(x): 
    return x + 1 

def decrement(x): 
    return x - 1 

if __name__ == '__main__': 
    pool = Pool(processes=2) 
    res1 = pool.map_async(increment, range(10)) 
    res2 = pool.map_async(decrement, range(10)) 

    print res1.get(timeout=1) 
    print res2.get(timeout=1) 
+0

感谢您的回答,但上面的代码片段实际上是一个较大的脚本的一部分,它已经包含了'if __name__ =='__main __''。无论如何,我试着将'if __name__ =='__main __''添加到代码片段中,但它仍然不起作用。即使是更奇怪的是,你提到的Python文档页上的'print'hello'例子也不起作用(它不打印任何东西)。 –

+0

@ user1453508,我已经添加了适合我的代码调整。你做的是一样的吗?尝试从python文档中添加'p.join()'示例。 –

+0

是的,如果我复制/粘贴您调整的代码,它不起作用(相同的超时错误);如果我将p.join()添加到python文档的示例中,它也不起作用。您使用的是哪个版本的Python和Windows? –