挂在pool.join()上的Python多处理

菲尔·G

尝试使用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,导致我收到此错误报告,但是在我的代码之前加上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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章