2015-08-26 64 views
0

我发现,当导入模块并同时使用多处理时,奇怪的事情开始发生。举个例子:多处理中的全局状态

# ------------------------- 
# 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模块中的用户获取敏感输入,并且我想要将该用户输入恰好一次。目前,用户必须输入他的数据一次,每个进程执行的进程 - 每次模块进口。

+0

请说明代码的哪些部分在哪个模块中。我假设上面的代码不在同一个文件中。 – Pynchia

+0

@Pynchia我添加到哪个文件开始 – WorldSEnder

+0

OK谢谢(顺便说一句,评论开始#)更大的意见。然后解释你打算做什么。你得到的行为正是你应该从给定场景期望的。问题是你想要达到什么目的/为什么你需要这样做? – Pynchia

回答

0

每个进程都有它自己的解释器实例,这就是为什么你的模块导入了多次。 (每次打印新的进程开始Imported)。

关于此问题的更多信息official documentatioin

+1

这是对问题的解释,但并不真正解决它。 – WorldSEnder

+0

在主进程中询问用户输入,然后将数据提供给您的池。 – trollknurr