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()
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要求将“ callable”提供为target
。如果说您尝试提供模块foo
(foo.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
而可用。当您将子例程传递给并发进程时,无法保证何时会调用它,甚至永远也不会。worker
worker
my_module
worker
您可以在Python模块中的任何位置(包括在函数/子例程中)导入模块。但是在这种情况下这样做可能不是最佳或必要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句