Python多进程Pool中全局变量无法在全局作用域递增的问题求助
问题排查与解决方案
核心问题分析
你的代码出现问题的核心原因是多进程的内存空间相互独立,叠加全局变量的错误使用:
- 每个子进程会复制主进程的内存空间,主进程中定义的
created = 0会被每个子进程单独拷贝一份,子进程修改的只是自己副本里的变量,其他进程完全看不到这个修改。因此每个进程执行created = created +1时,都是基于自身的初始值0计算,结果自然都是1。 - 模块顶层的
global created属于无效代码,模块本身就是全局作用域,这行没有实际作用;且子进程启动时(尤其是Windows系统的spawn模式),不会执行if __name__ == '__main__'中的代码,若不是fork模式,子进程里的created会处于未定义状态。 - 最初定义的
threading.Lock()是线程锁,仅适用于同一进程内的线程同步,对多进程完全无效。虽然你后续用manager.Lock()替换了,但锁只能保证操作的原子性,解决不了变量跨进程共享的根本问题。
修正后的代码
使用multiprocessing.Value创建跨进程共享的整数变量,配合多进程锁实现安全递增:
import multiprocessing as mp from functools import partial def task(lock, shared_created, ignore_arg): print("task") lock.acquire() # 操作共享变量的value属性完成递增 shared_created.value += 1 print(f"created ({shared_created.value})") lock.release() def task_init(output_queue): task.output_queue = output_queue if __name__ == '__main__': # 创建跨进程共享的整数变量,初始值为0 created = mp.Value('i', 0) output_queue = mp.Queue() p = mp.Pool(3, task_init, [output_queue]) # 使用多进程专用锁 lock = mp.Lock() # 绑定锁和共享变量到task函数 func = partial(task, lock, created) list_of_inputs = ['2', '3', '4'] p.map(func, list_of_inputs) p.close() p.join() # 等待所有子进程执行完毕
关键修改点
- 用
mp.Value('i', 0)创建共享整数:'i'表示变量类型为int,第二个参数是初始值,所有子进程可通过value属性访问和修改这个共享值。 - 将共享变量和多进程锁作为参数传递给
task函数,避免全局变量带来的作用域混乱。 - 增加
p.join()确保主进程等待所有子进程执行完成后再退出,避免子进程未执行完毕主进程就结束的情况。
内容的提问来源于stack exchange,提问作者intrigued_66
相关产品推荐
相关产品推荐

