Python多处理程序以执行脚本而不是函数

时间:2018-12-07 18:58:52

标签: python multiprocessing python-multiprocessing

1)multiprocessing模块支持我可以用来启动第二个进程而不是一个函数的Python脚本文件吗?

当前,我使用带有功能的multiprocessing.Process,但我想执行foo.py。我可以使用subprocess.Popen,但是multiprocessing.Process的好处是我可以传递对象(即使它们只是被腌制)。

当我使用multiprocessing.Process时,为什么在子进程中导入my_module,但未执行print(“ foo”)?

2)当我使用multiprocessing.Process时,为什么my_module被导入到子进程中却没有执行print("foo")?尽管未执行主作用域,但my_module如何可用?

import multiprocessing
import my_module
print("foo")

def worker():
    print("bar")
    my_module.foo()
    return

p = multiprocessing.Process(target=worker, args=(1,2, d))
p.start()
p.join()

2 个答案:

答案 0 :(得分:2)

您可以使用multiprocessing.pool()并将函数传递给要执行的方法。我个人使用过它,因为您可以将数据分为多个部分,也可以灵活使用cpu的数量。

答案 1 :(得分:2)

Python函数与要在另一个进程中运行的例程之间没有明显区别。函数只是过程。

如果您希望在另一个进程中运行的另一个脚本文件(在这种情况下为foo.py)具有以下内容:

# for demonstration only
from stuff import do_things

a = 'foo'
b = 1
do_things(a, b) # it doesn't matter what this does

您可以通过这种方式重构foo.py

from stuff import do_things

def foo():
    a = 'foo'
    b = 1
    do_things(a, b)

然后在该模块中生成该过程:

from foo import foo

p = multiprocess.Process(target=foo)
# ...

Process API要求将“可调用”作为target提供。如果说您尝试提供模块foo(其中foo.py是没有功能foo的第一个版本):

import foo
p = Process(target=foo)
p.start()

您将有一个TypeError: 'module' object is not callable错误的充分理由。想象一下,当您导入foo模块时,它会立即执行,因为它没有包装在功能/过程中,也称为callable。尝试在模块文件中插入打印语句并导入。模块级语句会立即进行评估。

这回答了问题2:

在顶层导入my_module时,即使未执行worker,每个模块也会导入一次。 my_module可用于worker,因为worker过程closes over my_module。 当您将worker之类的子例程传递给并发进程时,无法保证何时会调用它,甚至永远也不会。

您可以在Python模块中的任何位置(包括在函数/子例程中)导入模块。但是在这种情况下这样做可能不是最佳或必要的。