Python Multiprocessing:如何将其保存在指定的函数中?

Posted

技术标签:

【中文标题】Python Multiprocessing:如何将其保存在指定的函数中?【英文标题】:Python Multiprocessing: How do I keep it within the specified function? 【发布时间】:2016-05-25 14:09:50 【问题描述】:

我一直是 Stack Overflow 的长期观察者,但这次我只是找不到解决问题的方法,所以我在这里直接问你!

考虑这段代码:

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    p = Pool(5)
    print(p.map(f, [1, 2, 3]))

print "External"

这是使用池进行多处理的基本示例代码,在第一个框中找到 here,最后加上一个打印语句。

在 Windows 7、Python 2.7 上的 PyCharm 社区中执行此操作时,Pool 部分工作正常,但“外部”也会打印多次。结果,当我尝试在另一个程序中的特定函数上使用多线程时,所有进程最终都会运行整个程序。我该如何防止这种情况,所以只有给定的函数是多处理的?

我尝试改用 Process,关闭、加入和/或终止进程或池,将整个事物嵌入到函数中,从不同的文件调用所述函数(然后它开始执行该文件)。我找不到与我的问题相关的任何内容,并且觉得我错过了一些非常简单的东西。

【问题讨论】:

【参考方案1】:

由于print指令没有缩进,所以每次导入python文件时都会执行。也就是说,每次创建新进程时。

相反,if __name__ == '__main__ 下的所有代码不会在每次创建进程时执行,而只会从主进程执行,这是指令评估为 true 的唯一地方。

试试下面的代码,你应该不会再看到这个问题了。您应该会看到External 只打印到控制台一次。

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    p = Pool(5)
    print(p.map(f, [1, 2, 3]))

    print "External"

相关:python multiprocessing on windows, if __name__ == "__main__"

【讨论】:

解决了!我现在对整个概念有了更好的理解。谢谢!

以上是关于Python Multiprocessing:如何将其保存在指定的函数中?的主要内容,如果未能解决你的问题,请参考以下文章

(Python 多处理)如何访问与 multiprocessing.shared_memory.SharedMemory 共享的数组?

Python:如何检查 multiprocessing.Pool 中待处理任务的数量?

python multiprocessing:如何从子进程修改在主进程中创建的字典?

如何检查 Python Multiprocessing 中的 Process 类是不是有效?

Python Multiprocessing:如何将其保存在指定的函数中?

如何使用 multiprocessing.Manager()?