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

标签 python multiprocessing ipython pyzmq

当我尝试使用 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/

相关文章:

python - Django:测试自动生成(错误)的电子邮件

python - 在 Ubuntu 上将 Pyqt 安装到替代 Python 版本

python - 如果同一行的另一列中存在 null,则将列值与前一行连接起来

python - 如何使用 Selenium Python 单击 <a class href > 链接问题

c - 在 C 中调试多进程程序

python - 多处理中的有序状态打印

python - 如何在python中同时运行两个同步进程

python - 在其交互式 shell 中获取 Ipython QtConsole 当前配置信息

python - 使用来自 ipywidgets 的交互与数据框

python - ffmpeg 创建的 mp4 无法与 IPython.display.Video 一起播放