2016-05-31 78 views
0

我在python中使用模块多处理。在我使用映射函数调用主函数之前,我需要从用户那里获得一些输入。我的问题是main函数之前的代码被执行多次,当我打电话的主要功能与pool.map 这个非常简单的代码说明我的问题:多呼叫体多核处理python

from multiprocessing import Pool 
result=range(1,5) 
print('start') 
def test(a): 
    print(a+10) 
if __name__=="__main__": 
    pool = Pool(processes=2) 
    pool.map(test,result) 

我的输出则写着:

start 
start 
11 
12 
13 
14 
start 

为什么测试函数之前的代码会执行多次?

+2

它不(使用Python 3.5在这里)。输出中数字的顺序各不相同,所以一切都按预期工作。 – 2016-05-31 12:53:16

+0

但是无论打印的顺序如何,开始仍然会打印三次。这是否意味着打印语句和测试函数之前的代码在只运行一次时会执行三次? 此问题扩展到当我尝试从用户那里获得一些输入时,也会多次询问输入 – Bruno

+0

我无法再现您的输出 - 它只会打印“开始” – DomTomCat

回答

1

它不会为python 3.4显示“start”。

不知道你的Python版本,但可能是因为在每个进程池中,你的文件被导入,然后测试函数被执行。这意味着编写“全局”的代码在流程开始时执行一次。

我不得不承认它很奇怪,因为它意味着子进程不是分叉的,而是自己启动/导入当前的python脚本。

总之,要尊重PEP8,你应该这样做更多的是这样的:

from multiprocessing import Pool 

def test(a): 
    print(a+10) 

def main(): 
    result=range(1,5) 
    print('start') 
    pool = Pool(processes=2) 
    pool.map(test,result) 

if __name__=="__main__": 
    main() 
+0

完美这对我的作品感谢! 这意味着,无论何时我想运行一个包含pool.map的脚本,我都必须将我只想执行一次的所有代码放入其自己的函数中? – Bruno

+0

是的。一般来说,在文件的“基础”处不应写入代码,只有导入,函数/类定义和尾部 - 如果\ _ \ _ name \ _ \ _ ==“\ _ \ _ main \ _ \ _“---如果该文件将被执行。 – Ronan