我发现,当导入模块并同时使用多处理时,奇怪的事情开始发生。举个例子:多处理中的全局状态
# -------------------------
# main.py
# -------------------------
import multiprocessing
import foo
def bar(a):
foo.test()
if __name__ == "__main__":
pool = multiprocessing.Pool(5)
pool.map(bar, [1] * 15)
# ----------------------------
# foo.py
# ----------------------------
import api # Note the indirect import.
def test():
print(api.a)
# ----------------------------
# api.py
# ----------------------------
print("Imported")
a = 5
对于我这个例子中,输出是这样的:
Imported
Imported
5
5
5
5
5
5
5
5
5
5
5
Imported
5
5
5
5
注意,模块api
正在导入(即执行)多次。我怎么能避免这种情况?我想在模块api
中运行一次(如C中的静态初始化),并且我想从其他进程访问结果状态(在这种情况下为api.a
) - 但只能初始化一次。
在实际使用情况下,我从api
模块中的用户获取敏感输入,并且我想要将该用户输入恰好一次。目前,用户必须输入他的数据一次,每个进程执行的进程 - 每次模块进口。
请说明代码的哪些部分在哪个模块中。我假设上面的代码不在同一个文件中。 – Pynchia
@Pynchia我添加到哪个文件开始 – WorldSEnder
OK谢谢(顺便说一句,评论开始#)更大的意见。然后解释你打算做什么。你得到的行为正是你应该从给定场景期望的。问题是你想要达到什么目的/为什么你需要这样做? – Pynchia