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

三个Python脚本间基于多进程的持续数据交换异常问题排查与修复

解决跨进程数据共享失效的问题

我来帮你分析并解决这个问题——你遇到的核心问题是Python多进程的内存隔离特性导致的数据副本问题,加上不必要的重复进程创建,使得三个脚本间无法共享数据。

问题根因拆解

  1. 进程内存隔离:每个Python进程都有独立的内存空间。当你在mp1.py和script.py中分别导入mp2.py时,两个进程会各自创建mp2模块变量的副本。script.py调用setData修改的只是自己进程内的myl列表,mp1的进程(包括它每次启动的子进程)根本看不到这个变化。
  2. 重复创建子进程:mp1.py每秒启动一个新的Process来调用getData,每个新子进程都会重新复制mp2的初始变量([-1,-2])。所以每次子进程都会取出第一个元素-1,但下一个新进程又会拿到初始的列表,导致永远输出-1。

修正方案:使用跨进程共享数据结构

我们需要用multiprocessing.Manager创建跨进程共享的变量,同时调整mp1的逻辑,避免重复创建子进程。下面是修正后的完整代码:

1. mp2.py(使用共享变量)

from multiprocessing import Manager

# 用Manager创建跨进程共享的列表和状态标记
manager = Manager()
myl = manager.list([-1, -2])
# 'b'表示布尔类型,共享值需要通过.value属性访问/修改
mylConsumed = manager.Value('b', False)

def getData():
    print("Debug of getData")
    if not len(myl):
        print("myl is consumed")
        data = 0
        mylConsumed.value = True
    else:
        data = myl[0]
        myl.pop(0)
        print("myl list is: ", list(myl))
    return data

def setData(thisBuffer):
    if mylConsumed.value == True:
        myl.extend(thisBuffer)
        mylConsumed.value = False
        print("Updated myl: ", list(myl))

2. mp1.py(单进程持续发送数据)

from multiprocessing import Process, Pipe
from mp2 import getData
import time

parent_conn, child_conn = Pipe()

def dataSender():
    # 持续每秒获取并发送数据
    while True:
        data = getData()
        child_conn.send(data)
        time.sleep(1)

if __name__ == '__main__':
    # 只启动一次子进程,避免重复创建副本
    p = Process(target=dataSender)
    p.start()
    # 主线程持续接收数据
    while True:
        a = parent_conn.recv()
        print("Recieved Data is:", a)

3. script.py(逻辑不变,现在修改共享列表)

from mp2 import setData
from random import randint
import time

mybuf = [1,2,3,4,5,6,7,8,9,10]

def setBleData():
    setData(mybuf)

if __name__ == "__main__":
    while True:
        num = randint(1,5)
        time.sleep(num)
        setBleData()

效果验证

  1. 第一个终端运行python3 mp1.py,会先输出初始的-1、-2;
  2. 第二个终端运行python3 script.py,每隔1-5秒会将mybuf添加到共享列表中;
  3. 此时mp1.py会继续接收1、2、3...后续更新的数据,符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:44:07