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

Python multiprocessing多进程下列表更新同步问题求助

问题原因与解决方法

核心问题:多进程内存不共享

你用multiprocessing.Process启动的子进程,和主进程拥有完全独立的内存空间。子进程启动时会复制父进程的dateList,但之后子进程对列表的修改只会作用在自己的副本上,主进程的dateList完全不受影响,所以主循环里始终显示长度为0。

另外你的代码还有两个小错误:

  • addDate函数里写的thisList.append(message),应该是dateList.append(message),属于变量名笔误。
  • 全局变量的global声明位置错误,函数外的global没有意义,要在函数内部修改全局变量时才需要声明global。

解决办法:使用进程间共享数据结构

Python的multiprocessing模块提供了多种进程间通信的方式,这里推荐两种常用方案:

方法1:使用Manager().list()创建共享列表

修改后的代码示例:

from multiprocessing import Process, Manager

def run_script1(date_list):
    # 模拟Discord机器人的添加操作
    def addDate(message):
        date_list.append(message)
    # 机器人收到消息后调用addDate
    addDate("test1")
    addDate("test2")

def getDateList(date_list):
    return date_list

if __name__ == "__main__":
    manager = Manager()
    dateList = manager.list()  # 创建进程间共享的列表
    SIGNAL = True  # 假设触发信号为True

    process1 = Process(target=run_script1, args=(dateList,))
    process1.start()
    process1.join()  # 等待子进程执行完毕,实际场景可按需调整

    while True:
        if SIGNAL:
            print(len(getDateList(dateList)))  # 此时会输出2
            break  # 示例用break终止循环,实际场景按需处理
        else:
            continue

方法2:使用Queue传递数据

如果主进程只需要获取子进程添加的元素,不需要直接共享列表,可用队列实现:

from multiprocessing import Process, Queue
import time

def run_script1(queue):
    # 模拟机器人添加数据
    queue.put("test1")
    queue.put("test2")

if __name__ == "__main__":
    SIGNAL = True
    date_queue = Queue()

    process1 = Process(target=run_script1, args=(date_queue,))
    process1.start()

    while True:
        if SIGNAL:
            # 统计队列中的元素数量
            count = 0
            temp_list = []
            while not date_queue.empty():
                temp_list.append(date_queue.get())
                count +=1
            print(count)  # 输出2
            # 可将temp_list存回主进程的本地列表,按需处理
            break
        time.sleep(0.1)

关键注意点

  • 不要用普通的列表、字典等原生数据结构在多进程间共享修改,它们无法跨进程同步状态。
  • Manager创建的共享数据结构会有一定性能开销,如果是高频操作,优先考虑Queue、Pipe这类更轻量的通信方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:55:06