with Pool(4)as pool:# 阶段1:提交任务for i inrange(10):pool.apply_async(worker,(i,))# 阶段2:停止接受新任务pool.close()# 阶段3:等待任务完成pool.join()# 阶段4:后续处理print("所有进程已完成")
4. 常见问题解答
Q1: 不调用 close() 直接 join() 会怎样?
虽然可以运行,但不符合设计规范
可能造成资源管理混乱(特别是需要后续提交任务时)
Q2: 为什么 with 语句里还需要 close()?
with 会自动调用 close(),但显式调用更明确意图
在非 with 用法中必须手动调用
Q3: 可以只调用 terminate() 吗?
terminate() 会强制终止所有子进程
仅在异常处理时使用,正常流程应用 close()+join()
5. 与 map()/apply() 的对比
方法
是否需要 close()
是否需要 join()
阻塞行为
map()
自动处理
自动处理
阻塞直到完成
apply()
自动处理
自动处理
阻塞直到完成
apply_async
必须调用
必须调用
非阻塞,需等待
6. 实际应用场景
场景1:确保所有任务完成后再继续
pool = Pool(4)
results =[pool.apply_async(worker,(i,))for i inrange(100)]
pool.close()# 停止接受新任务
pool.join()# 等待100个任务全部完成print("最终结果:",[r.get()for r in results])
场景2:配合队列的写入进程
defwriter(queue):whileTrue:data = queue.get()if data =="STOP":breakprint(data)queue = Queue()
pool = Pool(4)
w_proc = Process(target=writer, args=(queue,))
w_proc.start()for i inrange(10):pool.apply_async(worker,(i, queue))pool.close()
pool.join()
queue.put("STOP")# 终止写入进程
w_proc.join()