当我尝试使用 multiprocessing
模块时遇到 Python 卡住问题。我将 Spyder 2.3.2 与 Python 3.4.3 一起使用(我之前遇到过特定于 iPython 的问题)。
我已将其简化为以下 MWE: 导入多处理
def test_function(arg1=1,arg2=2):
print("arg1 = {0}, arg2 = {1}".format(arg1,arg2))
return None
pool = multiprocessing.Pool(processes=3)
for i in range(6):
pool.apply_async(test_function)
pool.close()
pool.join()
在当前形式下,这应该只生成 test_function 的六个相同迭代。然而,虽然我可以毫不费力地输入命令,但当我输入命令 pool.join()
时,iPython 挂起,我必须重新启动内核。
该函数在串行完成时运行良好(我的 MWE 的下一步将是使用 pool.apply_async(test_function,kwds=entry)
。
for i in range(6):
test_function()
arg_list = [{'arg1':3,'arg2':4},{'arg1':5,'arg2':6},{'arg1':7,'arg2':8}]
for entry in arg_list:
test_function(**entry)
我(偶尔,而且我无法可靠地重现它)遇到 ZMQError: Address already in use
的错误消息,这让我找到了 this bug report ,但是在我的代码前面加上 multiprocessing.set_start_method('spawn')
或 multiprocessing.set_start_method('forkserver')
似乎不起作用。
任何人都可以提供任何帮助/建议吗?如果是这样,请提前致谢。
最佳答案
@Anarkopsykotik 是正确的:您必须使用 main
,并且可以通过将结果返回到主线程来让它打印。
这是一个工作示例。
import multiprocessing
import os
def test_function(arg1=1,arg2=2):
string="arg1 = {0}, arg2 = {1}".format(arg1,arg2) +" from process id: "+ str(os.getpid())
return string
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=3)
for i in range(6):
result = pool.apply_async(test_function)
print(result.get(timeout=1))
pool.close()
pool.join()
关于卡在 pool.join() 上的 Python 多处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34068355/