multiprocessing.dummy.Pool是否会在进程未完成前切换执行?
多进程中tqdm进度条未完成即切换进程的原因解析
使用
pool.map(func, iterable_obj)运行多子进程,每个函数内用tqdm监控进度(设置Pool(3)时显示3个进度条),但发现进程未完成(进度条未到100%)时,就切换到iterable_obj中的其他进程。函数涉及视频处理与.txt文件写入,疑问是否因等待I/O导致CPU切换进程?
核心原因:确实与I/O等待直接相关
- 你的函数包含视频处理、文件写入这类I/O密集型操作,当子进程在等待磁盘读写(比如写入.txt文件、视频解码/编码时的磁盘I/O)时,CPU会处于空闲状态。操作系统的进程调度器会自动将空闲的CPU资源分配给其他等待运行的子进程,这就会出现你看到的“进度条没走完就切换进程”的现象。
- 结合
pool.map的工作机制来看:进程池会预先启动指定数量的进程(比如你设置的3个),当某个进程因I/O阻塞挂起时,进程池会把iterable_obj里的下一个任务分配给空闲的进程(如果存在)。这不是进程被“强制切换”,而是多个进程在交替利用CPU资源,所以你会看到多个进度条交替更新。 - 额外说明:每个子进程的
tqdm进度条是独立维护的,当某个进程因I/O暂停时,它的进度条会停滞,而其他进程的进度条继续推进,视觉上就会产生“切换到其他进程”的错觉。
内容的提问来源于stack exchange,提问作者王韋翰
相关产品推荐
相关产品推荐

