python - 使用 importlib 选择模块并在多处理函数中使用

标签 python multiprocessing python-import

我想在我的主函数中根据传递给 Python 脚本的参数选择要导入的模块。所以,我正在使用其中之一

blah = importlib.import_module("blah1")
blah = importlib.import_module("blah2")

其中“blahX”是同一接口(interface)的不同实现。

我还想使用多处理模块将工作传递给不同的进程。

blah = None

def f(a, b):
    print blah.f(a,b)

if __name__ == '__main__':

    # call importlib.import_module here...

    a = 1
    b = 2
    p = multiprocessing.Process(target=f, args=(a, b))
    p.start()
    p.join()

问题是传递给 multiprocessing.Process 的函数不知道我在 main 中导入的模块。这与我使用 import

不同
import blah1 as blah
#import blah2 as blah

但是我失去了在运行时选择模块的能力。

我该如何修复这个设计?

最佳答案

当您调用 mp.Process(...) 时,多处理模块会派生一个子进程(在 Unix 上)或启动一个新的 Python 进程并导入调用模块(在 Windows 上)。在 Unix 上,您当前的代码可以工作,因为 fork 时的所有全局变量都会被新的子进程复制。

但是,在 Windows 上,调用模块是导入的。由于 blah 的定义,例如,

blah = importlib.import_module("math")

内部受到保护

if __name__ == '__main__':

blah 的新定义不会传输到子进程。

因此,要使其在 Windows 上工作,您可以将模块的名称传递给目标函数,并在那里调用 importlib.import_module :

import importlib
import multiprocessing as mp
blah = None

def f(a, b, name):
    blah = importlib.import_module(name)
    print blah.hypot(a,b)

if __name__ == '__main__':
    a = 1
    b = 2
    p = mp.Process(target=f, args=(a, b, "math"))
    p.start()
    p.join()

关于python - 使用 importlib 选择模块并在多处理函数中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17503909/

相关文章:

python - Seaborn 箱线图和线图显示不正确

Python 给出冗长的输出,表明模块正在被销毁

Python:在函数中使用在类内部完成的导入

python - 从导入的函数打开文件

python - 在 Spotipy 中设置凭据时遇到问题

python - Pandas 添加一列并使用列表推导式填充值 if else

python - 试图在谷歌云中查找已部署的 python 函数的当前项目 ID 会出错

python - 使用 multiprocessing.Pool 泄漏内存,即使在 close() 之后

android - 在多进程模式下使用 SharedPreferences

python - KeyError:0 在 python 中使用多处理