if __name__ == '__main__':
with Pool(4) as p:
print(p.map(work, tasks))
Windows 上 Pool.map 抛 RuntimeError,原文提到 bootstrapping phase。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:spawn 方式会重新导入主模块,建进程的代码在导入时又执行一遍,子进程继续建子进程,解释器只能报错拦住。
这次卡住的地方就在「多进程 main 保护」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
处理上按这个顺序:把所有启动代码放进主入口的 name 判断里;子进程要调的函数定义在模块顶层,才能序列化;主模块里不要放建连接、读配置这类重的初始化。
确认没问题再收工,任务正常分到各进程,控制台不再出现 bootstrapping 报错。
