Python多进程通信:基于Queue的进程间数据交互分析

顾星河
顾星河
发布时间:2026-10-14 | 4人浏览过
原创

本文通过Python程序实例,详细解析了在树莓派环境下如何利用multiprocessing模块中的Queue实现两个进程间的数据交互与协同工作。文章深入分析了进程初始化、队列数据读写机制,并通过实际测试验证了Queue的先进先出特性,为多进程并发处理图像识别与运动控制等任务提供了参考方案。

前言

当前购物车项目面临一项任务需求:需同时进行图像识别与运动控制。为此,系统需要初始化两个独立的进程,分别负责执行相应的动作。由于运动控制模块依赖图像识别模块的输出结果,这就涉及到了Python中两个进程如何协同合作的问题。本文将结合具体的Python代码,通过队列(Queue)机制来实现进程间的数据交互与通信。

程序逻辑分析

首先介绍程序中所需的核心库函数:


import time
from multiprocessing import Process, Queue

from multiprocessing import Process, Queue是本次实现的主要库,它提供了队列和进程操作的相关函数。在本次测试中,我们主要使用了以下进程和队列操作函数:


q1.get()#获取q1队列里的内容
q1.put("q1 put things1")#往q1队列里面加入内容
p1 = Process(target=test1, args=(q1, q2))#初始化p1进程
p1.start()#启动p1进程
p1.join()#将p1进行加入系统调度
q1.qsize()#查看q1队列的大小

测试中线程与进程的对应关系如下:


q1队列 -> q1进程
q2队列 -> q2进程

具备上述基础函数后,我们来看具体的程序实现。在代码中,首先进行了进程的初始化、启动以及加入系统调度的操作。执行完这些语句后,可以认为p1和p2两个进程已经初始化完成。


p1 = Process(target=test1, args=(q1, q2))
p2 = Process(target=test2, args=(q1, q2))

p1.start()
p2.start()

p1.join()
p2.join()

进程初始化完成后,我们进入主要的测试函数部分,首先是test1函数的实现。


def test1(q1, q2):
    q1.put("fisrt data")
    while(1):
        s = q2.get()
        print('q2 left + ' + str(q2.qsize()))
        print('q1 get + ' + s)
        q1.put("q1 put things1")
        q1.put("q1 put things2\n")
        time.sleep(1)

在之前的初始化函数中,我们先初始化了p1进程,这意味着test1会优先运行。为了保证进程启动初期队列中有数据,我在函数开头将“fisrt data”加入了q1队列。为确保测试持续进行,我将test1进程设置为死循环。在test1中,程序首先获取q2队列的内容及其大小并打印,随后在q1队列中放入新内容。请注意,这里放入了两个节点的数据,分别是“q1 put things1”和“q1 put things2\n”。

在此提出一个关键问题:

当p1进程尝试获取q2队列中的内容时,p1进程是将q2队列中的全部内容取出,还是仅取出q2队列最前面的那个数据?

接下来我们将解决这个问题。请看test2函数的具体实现:


def test2(q1, q2):
    while(1):
        s = q1.get()
        print('q1 left + ' + str(q1.qsize()))
        print('q2 get + ' + s)
        q2.put("q2 put data1")
        time.sleep(1)

在test2函数中,操作相对简单:首先获取q1队列中的数据及剩余队列大小并打印,接着向q2队列加入“q2 put data1”。

结果分析

我们来看一下main函数中的调用逻辑:


if __name__ == '__main__':
    p1 = Process(target=test1, args=(q1, q2))
    p2 = Process(target=test2, args=(q1, q2))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

在main函数中,主要执行了线程启动的操作。我们进一步观察程序的输出结果:

从输出结果中可以清晰地看到,q1进程每次会加入2个节点数据,随后p2进程会从q1队列中执行q1.get()操作。随着循环次数的增加,我们可以发现q1队列的长度不断增加。由此可以得出结论: 当p1进程去获取q2队列里的内容时,p1进程仅会取出q2队列最前面的那个数据。

至此,关于Python在树莓派上通过队列实现进程交互的程序分析介绍完毕。如需了解更多相关Python树莓派进程交互内容,请搜索本站历史文章或继续浏览后续相关文章。感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表