1)multiprocessing
模块是否支持 Python 脚本文件,我可以用来启动第二个进程而不是函数?
目前我使用multiprocessing.Process
它需要一个函数,但我想执行foo.py
。我可以使用subprocess.Popen
但multiprocessing.Process
的好处是我可以传递对象(即使它们只是腌制的)。
当我使用多处理时。进程,为什么my_module子进程中导入,但打印("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 要求提供"可调用"作为target
。如果假设您尝试提供模块foo
(其中foo.py
是第一个没有函数foo
的版本):
import foo
p = Process(target=foo)
p.start()
您将有充分的理由得到TypeError: 'module' object is not callable
错误。想象一下,当您导入模块foo
它会立即急切地执行,因为它没有包装在函数/过程(又名callable
中)。尝试在模块文件中插入 print 语句并将其导入。模块级语句会立即计算。
这回答了问题2:
在顶层导入my_module
时,即使未执行worker
也会为每个模块导入一次。my_module
可供worker
使用worker
因为该程序在my_module
关闭。 当您将子例程(如worker
)传递给并发进程时,无法保证何时调用它,甚至永远都不会调用它。
您可以在 Python 模块中的任何位置导入模块,包括在函数/子例程中。但在这种情况下这样做可能不是最佳或必要的。
您可以使用multiprocessing.pool()并将函数传递给要执行的方法中。我个人使用它,因为您可以将数据分成多个部分,并且还可以灵活地使用 CPU 的数量。