本文小编为大家详细介绍“python树莓派通过队列怎么实现进程交互的程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“python树莓派通过队列怎么实现进程交互的程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
现在购物车有一任务需求,那就是需要进行图像识别和运动控制,因此需要初始化2个进程,从而分别完成相应的动作。因为运动控制需要图像识别的结果,因此现在就涉及到了python语法实现2个进程之间的协同合作,这篇博客就结合实际的python程序通过队列实现进程交互通过队列实现进程交互。
首先介绍一下我们的需要的库函数:
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 ") time.sleep(1)
在之前的初始化函数中,我们是先初始化了p1进程,也就是test1
会先运行,因此为了保证在开始的时候进程的队列里面有内容,我先在函数的最开始就在q1队列中加入了内容“fisrt data”,为了保证测试持续进行,因此我将test1
进程设成了死循环,在test1
中,会先去获取q2队列里的内容和q2队列大小并打印,然后会在q1队列中放入新的内容,请注意,这里放入了2个节点的数据,分别是“q1 put things1”和“q1 put things2 ”
在这里我提出一个问题:
那就是当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队列中的数据和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树莓派通过队列怎么实现进程交互的程序”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。