在Python中,进程池(Pool)是multiprocessing模块提供的一种并发执行任务的机制。它通过创建一组工作进程,可以高效地处理大量任务,特别适合CPU密集型操作。
为什么使用进程池?
初始化Pool的基本语法如下:
from multiprocessing import Pool
# 初始化进程池
pool = Pool(processes=4) # 创建包含4个工作进程的进程池
http:/shanmaozhibo.mfdgt.com
http:/shanmaozhibo.wsxzc.com
参数 | 默认值 | 说明 |
|---|---|---|
processes | os.cpu_count() | 工作进程的数量,通常设置为CPU核心数 |
initializer | None | 每个工作进程启动时调用的函数 |
initargs | () | 传递给initializer的参数元组 |
maxtasksperchild | None | 每个工作进程在退出前可以完成的任务数 |
import multiprocessing
import os
# 获取CPU核心数
cpu_count = os.cpu_count()
print(f"系统CPU核心数: {cpu_count}")
# 初始化进程池,使用一半的CPU核心
pool = multiprocessing.Pool(processes=cpu_count // 2)
http:/shanmaozhibo.kstg321.com
http:/saierchao.diusong.com
def init_worker():
# 每个工作进程初始化时执行
print(f"Worker PID: {os.getpid()} 初始化")
# 初始化带initializer的进程池
pool = multiprocessing.Pool(
processes=4,
initializer=init_worker
)
http:/shanmaozhibo.diusong.com
http:/shanmaozhibo.xinjiangzijiayou.com
def setup_worker(config):
# 带参数的初始化函数
print(f"Worker {os.getpid()} 初始化,配置: {config}")
# 初始化参数
worker_config = {"mode": "production", "log_level": "info"}
# 初始化进程池
pool = multiprocessing.Pool(
processes=4,
http:/shanmaotiyu.diusong.com
http:/shanmaotiyu.xinjiangzijiayou.com
initializer=setup_worker,
initargs=(worker_config,),
maxtasksperchild=100 # 每个工作进程处理100个任务后重启
)进程池大小通常设置为CPU核心数:
使用上下文管理器确保资源释放:
with Pool(4) as pool:
results = pool.map(process_data, data_list)
# 退出with块后自动关闭进程池始终使用try-except确保异常处理:
try:
pool = Pool(4)
# 执行任务
except Exception as e:
print(f"发生错误: {e}")
finally:
pool.close() # 停止接受新任务
pool.join() # 等待工作进程退出
http:/shanmaotiyu.mfdgt.com
http:/shanmaotiyu.wsxzc.comimport multiprocessing
import os
import time
# 初始化函数
def init_worker():
print(f"Worker {os.getpid()} 初始化完成")
# 任务处理函数
def process_task(data):
print(f"进程 {os.getpid()} 处理数据: {data}")
time.sleep(1) # 模拟处理时间
return data * 2
if __name__ == "__main__":
# 创建进程池
with multiprocessing.Pool(
processes=4,
initializer=init_worker
) as pool:
# 准备任务数据
data = [1, 2, 3, 4, 5, 6, 7, 8]
# 使用map方法并行处理
results = pool.map(process_task, data)
print("处理结果:", results)
print("所有任务已完成")A: Windows没有fork系统调用,创建新进程时会重新导入模块。使用这个保护可以避免无限递归创建进程。
A: 如果任务有内存泄漏风险,可设置为100-1000,让工作进程定期重启。对于无泄漏任务,设置为None即可。
A: 使用with语句可以确保在代码块结束后自动调用pool.close()和pool.join(),避免资源泄漏。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。