求助:Python多进程中全局变量无法共享的问题
问题原因
Python的multiprocessing模块创建的每个进程都拥有独立的内存空间,你定义的全局变量counter会被每个进程复制一份到自己的内存里。my_function修改的是自己进程里的counter副本,my_function_two打印的却是自己进程里初始为0的副本,自然看不到数值变化——这和线程共享同一进程内存的逻辑完全不一样,所以查线程的资料没用。
解决方法:使用进程间共享变量
用multiprocessing.Value可以创建跨进程共享的变量,再配合Lock保证多进程操作时的原子性(避免多个进程同时修改导致数据混乱)。
修改后的代码示例:
import multiprocessing import time def my_function(counter, lock): while True: # 加锁确保修改操作是原子的 with lock: counter.value += 1 time.sleep(0.001) # 加个小延迟,避免占用过多资源 def my_function_two(counter, lock): while True: with lock: current_val = counter.value print(current_val) time.sleep(0.1) # 控制打印频率,避免刷屏 if __name__ == "__main__": # 创建共享的整数变量,初始值0 counter = multiprocessing.Value('i', 0) # 创建锁对象 lock = multiprocessing.Lock() process1 = multiprocessing.Process(target=my_function, args=(counter, lock)) process2 = multiprocessing.Process(target=my_function_two, args=(counter, lock)) process1.start() process2.start() # 让进程运行5秒后停止 time.sleep(5) process1.terminate() process2.terminate() process1.join() process2.join()
关键说明
multiprocessing.Value('i', 0)里的'i'表示变量类型为整数,其他类型比如'd'对应浮点数,按需选择即可。- 必须用锁包裹对共享变量的读写操作,否则多个进程同时操作会导致数值计算错误(比如两个进程同时读取到同一个值,加1后写回去,相当于只加了一次)。
- 原代码里的死循环会导致程序一直运行,这里加了
time.sleep(5)后终止进程,方便测试。
内容的提问来源于stack exchange,提问作者Edoardo Calderoni
相关产品推荐
相关产品推荐

