gpt4 book ai didi

python - 将多处理与 runpy 结合使用

转载 作者:行者123 更新时间:2023-12-01 00:29:31 24 4
gpt4 key购买 nike

我有一个使用多处理的Python模块。我正在使用 runpy 从另一个脚本执行此模块。但是,这会导致 (1) 模块运行两次,并且 (2) 多处理 作业永远不会完成(脚本只是挂起)。

在我的最小工作示例中,我有一个脚本runpy_test.py:

import runpy
runpy.run_module('module_test')

和一个目录module_test,其中包含一个空的__init__.py和一个__main__.py:

from multiprocessing import Pool

print 'start'
def f(x):
return x*x
pool = Pool()
result = pool.map(f, [1,2,3])
print 'done'

当我运行runpy_test.py时,我得到:

start
start

并且脚本挂起。

如果我删除 pool.map 调用(或者如果我直接运行 __main__.py,包括 pool.map 调用),我得到:

start
done

我在 Python 2.7.5 中的 Scientific Linux 7.6 上运行它。

最佳答案

重写你的__main__.py像这样:

from multiprocessing import Pool
from .implementation import f

print 'start'
pool = Pool()
result = pool.map(f, [1,2,3])
print 'done'

然后写一个implementation.py (您可以随意调用它)其中定义了您的函数:

def f(x):
return x*x

否则,您将在多处理中的大多数接口(interface)上遇到相同的问题,并且与使用 runpy 无关。正如 @Weeble 所解释的,当 Pool.map尝试加载函数f在每个子流程中它将导入 <your_package>.__main__定义函数的位置,但由于您在 __main__ 中有模块级别的可执行代码它将被子进程重新执行。

除了这个技术原因之外,这在关注点分离和测试方面也是更好的设计。现在您可以轻松导入和调用(包括出于测试目的)函数 f无需并行运行。

关于python - 将多处理与 runpy 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58288945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com