Python multiprocessing需要避免的陷阱

本文讨论了Python multiprocessing模块的一个常见问题,即在Mac上正常运行但在Windows上失败的情况。问题源于`run`作为顶级语句在模块导入时被触发执行。官方文档指出,模块应能被子进程导入,而在当前情况下,该要求未得到满足。解决方案是将`run`函数放入`if __name__ == '__main__':`的main部分,以防止在导入时意外执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段代码可以在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")



原因如下

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值