Python多进程Pool使用疑问:为何所有任务PID相同?
问题原因与修正方法
你的理解本身没太大偏差:Pool确实会启动指定数量的子进程并行处理任务,并且会复用这些进程。但你看到所有输出都是同一个PID,是因为输出缓冲的问题——在Windows系统中,子进程的标准输出默认是缓冲模式,当任务执行极快时,子进程还没来得及把print内容刷新到控制台就结束了,最终所有缓冲的输出被一次性打印出来,看起来像是同一个PID(实际是输出显示的误导)。
要验证并解决这个问题,你可以修改f函数,强制刷新输出缓冲区,同时加个小延迟模拟真实任务的执行时长:
import multiprocessing from multiprocessing import Pool import time def f(x): time.sleep(0.1) print(f'PID {multiprocessing.current_process().pid}', flush=True) return x*x if __name__ == '__main__': with Pool(processes=4) as pool: print(pool.map(f, range(10)))
修改后运行,你就能看到4个不同的PID被交替输出,符合你对Pool的预期。
补充说明:Pool的进程复用机制是,当一个任务完成后,空闲进程会接手下一个任务,所以10个任务用4个进程时,每个进程会处理2-3个任务,最终输出里会重复出现这4个PID,但不会只有单一PID。
内容的提问来源于stack exchange,提问作者user4409082
相关产品推荐
相关产品推荐

