Python多进程通信:基于Queue的进程间数据交互分析
本文通过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树莓派进程交互内容,请搜索本站历史文章或继续浏览后续相关文章。感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









