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

多进程环境下如何动态修改列表变量实现倍数递增输出

多进程下共享列表的问题解决

你写了一段Python代码,想用多进程动态更新列表并每秒打印,期望每次打印的列表最后一个元素是前一次的2倍,但实际输出始终是初始列表,加了global lis也没用。

原代码:

import time, multiprocessing

lis = [1, 2, 4]

def printer():
    while True:
        print(lis)
        time.sleep(1)

def updater():
    while True:
        time.sleep(1)
        lis.append(lis[-1]*2)

if __name__ == '__main__':
    process1 = multiprocessing.Process(target=updater)
    process2 = multiprocessing.Process(target=printer)

    process1.start()
    process2.start()

    process1.join()
    process2.join()

问题根源

Python的多进程机制是每个子进程都会复制父进程的内存空间,也就是说lis在两个子进程里各有一份独立的副本:

  • updater进程修改的是自己那份lis,和printer进程里的lis完全没关系
  • printer进程一直读的是自己初始化时的那份初始列表,自然看不到更新

加global lis没用,因为global只是声明用全局变量,但这个全局变量在每个进程里都是独立的副本。

解决方法:用multiprocessing.Manager创建共享列表

通过multiprocessing.Manager可以创建跨进程共享的对象,它会在后台启动一个服务进程,所有子进程通过代理访问这个共享对象,这样就能实现数据同步。

修改后的代码:

import time, multiprocessing

def printer(lis):
    while True:
        print(lis)
        time.sleep(1)

def updater(lis):
    while True:
        time.sleep(1)
        lis.append(lis[-1]*2)

if __name__ == '__main__':
    # 创建可共享的列表
    with multiprocessing.Manager() as manager:
        lis = manager.list([1, 2, 4])
        process1 = multiprocessing.Process(target=updater, args=(lis,))
        process2 = multiprocessing.Process(target=printer, args=(lis,))

        process1.start()
        process2.start()

        process1.join()
        process2.join()

关键改动说明

  1. 用manager.list()替代普通列表,创建跨进程共享的列表对象
  2. 将共享列表作为参数传给两个进程,避免依赖全局变量(全局变量在多进程里本来就不共享)
  3. 使用with语句管理Manager,确保资源自动释放

运行这段代码后,输出就会符合你的期望:

[1, 2, 4]
[1, 2, 4, 8]
[1, 2, 4, 8, 16]
[1, 2, 4, 8, 16, 32]
...

内容的提问来源于stack exchange,提问作者John Persuro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:56:13