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()
答案 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模块中的任何位置(包括在函数/子例程中)导入模块。但是在这种情况下这样做可能不是最佳或必要的。