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



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

目前我使用multiprocessing.Process它需要一个函数,但我想执行foo.py。我可以使用subprocess.Popenmultiprocessing.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)
# ...

ProcessAPI 要求提供"可调用"作为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 的数量。

相关内容

  • 没有找到相关文章

最新更新