三个Python脚本间基于多进程的持续数据交换异常问题排查与修复
解决跨进程数据共享失效的问题
我来帮你分析并解决这个问题——你遇到的核心问题是Python多进程的内存隔离特性导致的数据副本问题,加上不必要的重复进程创建,使得三个脚本间无法共享数据。
问题根因拆解
- 进程内存隔离:每个Python进程都有独立的内存空间。当你在
mp1.py和script.py中分别导入mp2.py时,两个进程会各自创建mp2模块变量的副本。script.py调用setData修改的只是自己进程内的myl列表,mp1的进程(包括它每次启动的子进程)根本看不到这个变化。 - 重复创建子进程:
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()
效果验证
- 第一个终端运行
python3 mp1.py,会先输出初始的-1、-2; - 第二个终端运行
python3 script.py,每隔1-5秒会将mybuf添加到共享列表中; - 此时
mp1.py会继续接收1、2、3...后续更新的数据,符合你的预期。
内容的提问来源于stack exchange,提问作者izidor
相关产品推荐
相关产品推荐

