2012-09-17 52 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? –