Python multiprocessing需要避免的陷阱

来源:互联网 发布:学游泳费用 知乎 编辑:程序博客网 时间:2024/06/05 10:44

这段代码可以在Mac上正常运行(windows不行)

# build.pyfrom multiprocessing import Poolimport tracebackdef f(x):    print 'start pool.f'    return x*xdef run():    for line in traceback.format_stack():        print(line.strip())    print 'start pool.run'    pool = Pool(processes=1)    print 'start pool.map'    print pool.map(f, range(10))run()

最终输出

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

但是,如果通过下面的代码运行,程序就会死掉

# jenkins.pyimport buildprint "doesn't run this line at all. the program is hanging in import"build.run()build.f()build.inexist_fuction("the function doesn't exist, python doesn't have chance to check it")



原因如下

#1 build.py中的run是top level的语句,当jenkins.py import build.py的时候,run被执行

#2 在官方文档中https://docs.python.org/2/library/multiprocessing.html有这么一个要求

Functionality within this package requires that the __main__ module be importable by the children.

在#1所描述的运行状态下,上述要求不成立


解决办法:

在build.py中不要run放到main中


0 0
原创粉丝点击