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

丹尼尔·斯蒂芬斯(Daniel Stephens)

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()
派'Oh'Pah

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)
# ...

ProcessAPI要求将“ callable”提供为target如果说您尝试提供模块foofoo.py第一个没有功能的版本在哪里foo):

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

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

这回答了问题2:

当您导入my_module在顶层,它的进口,每个模块一次,即使worker没有执行。因为程序关闭my_module而可用当您将子例程传递给并发进程时,无法保证何时会调用它,甚至永远也不会。workerworkermy_moduleworker

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

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章