使用multiprocessing.Pool时如何获取当前进程的本地枚举索引?
如何获取multiprocessing.Pool工作进程的本地枚举编号
Python标准库没有直接暴露该编号的公开接口,以下两种方法可以稳定实现需求:
方法1:使用进程初始化函数绑定唯一编号(推荐)
利用Pool的initializer参数,在每个工作进程启动时为其分配唯一的本地编号,存入进程独立的全局变量中,这种方法不依赖框架内部实现规则,兼容性最好。
from multiprocessing import Pool, Value # 每个进程独立的全局变量,存储当前进程的本地编号 process_idx = None def init_worker(counter): global process_idx # 原子操作获取唯一编号 with counter.get_lock(): counter.value += 1 process_idx = counter.value def job(x): print(f'job {x} process {process_idx}') if __name__ == '__main__': # 初始化跨进程计数器,初始值为0 worker_counter = Value('i', 0) with Pool(4, initializer=init_worker, initargs=(worker_counter,)) as p: p.imap(job, range(10)) p.close() p.join()
方法2:解析进程默认名称获取编号(极简)
multiprocessing创建的池工作进程默认名称格式为[Spawn/Fork]PoolWorker-<编号>,编号就是你需要的本地枚举值,直接提取即可。
from multiprocessing import Pool, current_process import re def job(x): # 提取进程名末尾的数字作为本地编号 process_idx = int(re.search(r'\d+$', current_process().name).group()) print(f'job {x} process {process_idx}') if __name__ == '__main__': with Pool(4) as p: p.imap(job, range(10)) p.close() p.join()
注意:这种方法不需要额外配置,实现简单,但是如果你手动修改了工作进程的命名规则,该方法会失效。
内容的提问来源于stack exchange,提问作者flawr
相关产品推荐
相关产品推荐

