You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:57:39