Python中Multiprocessing失效:Pool.apply/Pool.map无响应,脚本持续运行
解决Multiprocessing脚本持续运行无响应的问题
先看你代码里的一个明显小问题——你用了大写的Print(),但Python的内置打印函数是小写的print()。这个错误会导致子进程执行时抛出异常,但因为multiprocessing的子进程异常不会直接在主进程显示出来,反而会让整个程序卡住。先把这个修正过来,代码应该改成这样:
from multiprocessing import Pool def doubler(number): return number * 2 if __name__ == '__main__': numbers = [5, 10, 20] pool = Pool(processes=4) print(pool.map(doubler, numbers))
如果修正后还是卡住,那大概率是系统或环境层面的问题,可以从这几个方向排查:
Windows系统的进程启动限制:Windows下multiprocessing默认用
spawn方式创建进程,这种方式会重新导入主模块。如果你的脚本里有其他顶级代码(不在if __name__ == '__main__'块里的),可能会触发无限创建子进程的死循环,直接导致程序卡住。一定要确保所有实际执行的逻辑都包裹在if __name__ == '__main__'里面。系统资源不足:如果你的CPU或内存被其他程序占满了,Pool创建的子进程可能无法正常启动或执行。先关闭一些占用资源的程序,再试试脚本。另外也可以把
processes参数调小一点(比如改成2),避免一次性创建过多进程拖垮系统。排查子进程的隐藏异常:有时候子进程抛出了异常但主进程感知不到,看起来就像程序卡住了。你可以给
doubler函数加上日志或者异常捕获,或者用apply_async配合回调函数来追踪执行情况:
from multiprocessing import Pool import traceback def doubler(number): try: print(f"正在处理数字: {number}") return number * 2 except Exception as e: traceback.print_exc() return None def handle_result(result): print(f"收到结果: {result}") if __name__ == '__main__': numbers = [5, 10, 20] pool = Pool(processes=2) for num in numbers: pool.apply_async(doubler, args=(num,), callback=handle_result) pool.close() pool.join()
这样能清楚看到子进程里的执行细节,方便排查是否有隐藏的问题。
- 检查安全软件的拦截:有些杀毒软件或系统安全工具可能会阻止Python创建子进程,导致进程无法正常启动。可以暂时关闭这类工具,再测试脚本能不能正常运行。
内容的提问来源于stack exchange,提问作者user11475892
相关产品推荐
相关产品推荐

