Python multiprocessing需要避免的陷阱

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

# build.py
from multiprocessing import Pool
import traceback


def f(x):
    print 'start pool.f'
    return x*x


def 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.py
import build
print "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")

Python multiprocessing需要避免的陷阱_第1张图片


原因如下

#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中


你可能感兴趣的:(python)