Python使用multiprocessing多进程运行代码无输出的问题咨询
问题根因及解决方案
1. 缺失多进程入口保护(最常见触发原因)
Windows、macOS 平台下 Python 的 multiprocessing 默认使用 spawn 模式启动子进程,该模式下子进程会重新导入整个主模块代码,如果没有把顶层执行逻辑放在 if __name__ == '__main__' 判断块内,子进程导入时会重复执行实例化、启动进程的逻辑,最终无法执行预期的run方法,也不会产生输出。
2. 输出缓冲问题
部分场景下子进程的print输出会被系统缓存,没有即时刷新到终端,也会导致看不到预期输出。
修正后可正常运行的代码
import multiprocessing as mp class A: def __init__(self, num_workers=mp.cpu_count()): self.num_workers = num_workers self.x = 5 def process(self): workers = [] for i in range(self.num_workers): workers.append(B(self.x)) for worker in workers: worker.start() for worker in workers: worker.join() class B(mp.Process): def __init__(self, val): mp.Process.__init__(self) self.val = val def square(self): # 增加flush=True强制刷新输出缓冲,避免输出滞留缓存 print(self.val * self.val, flush=True) def run(self): self.square() # 必须加入口保护,仅主模块执行时才运行启动逻辑 if __name__ == '__main__': a = A() a.process()
多线程改多进程额外注意事项
- 多进程之间默认不共享全局变量、实例属性,原多线程逻辑中靠共享变量传值的部分,需要改用
mp.Queue、mp.Manager、管道或者共享内存实现 - 传递给进程的参数必须是可序列化(支持pickle)的,不可序列化的对象无法跨进程传递
- 进程创建开销远大于线程,不要创建远多于CPU核心数的工作进程,避免频繁上下文切换降低性能
内容的提问来源于stack exchange,提问作者MAN-MADE
相关产品推荐
相关产品推荐

