python树莓派通过队列实现进程交互的程序分析


Posted in Python onJuly 04, 2021

写在前面

现在购物车有一任务需求,那就是需要进行图像识别和运动控制,因此需要初始化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\n")
        time.sleep(1)

在之前的初始化函数中,我们是先初始化了p1进程,也就是test1会先运行,因此为了保证在开始的时候进程的队列里面有内容,我先在函数的最开始就在q1队列中加入了内容“fisrt data”,为了保证测试持续进行,因此我将test1进程设成了死循环,在test1中,会先去获取q2队列里的内容和q2队列大小并打印,然后会在q1队列中放入新的内容,请注意,这里放入了2个节点的数据,分别是“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队列中的数据和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函数里面只是做了线程启动的操作,我们再来看一下输出结果:

python树莓派通过队列实现进程交互的程序分析

从结果中我们可以很清楚的看到,q1线程每次会加入2个节点数据,然后p2进程会从q1线程中做q1.get()的操作,随着循环次数的不断增加,我们可以发现q1队列的长度不断增加,从而我们可以得出结论:
p1进程去获取q2队列里的内容的时候,p1进程会将q2队列最前面的那个数据取出

到此这篇关于python树莓派通过队列实现进程交互的程序分析的文章就介绍到这了,更多相关python树莓派进程交互内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现将读入的多维list转为一维list的方法
Jun 28 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
使用wxpy实现自动发送微信消息功能
Feb 28 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
Mar 03 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
Python 利用OpenCV给照片换底色的示例代码
Aug 03 Python
Python Opencv实现单目标检测的示例代码
Sep 08 Python
python对输出的奇数偶数排序实例代码
Dec 04 Python
python使用正则表达式匹配txt特定字符串(有换行)
Dec 09 Python
python如何实现递归转非递归
Feb 25 Python
Python多线程 Queue 模块常见用法
Jul 04 #Python
python 中yaml文件用法大全
Jul 04 #Python
python3实现常见的排序算法(示例代码)
用Python编写简单的gRPC服务的详细过程
Jul 04 #Python
python中__slots__节约内存的具体做法
Jul 04 #Python
python中Matplotlib绘制直线的实例代码
Jul 04 #Python
C站最全Python标准库总结,你想要的都在这里
You might like
最常用的8款PHP调试工具
2014/07/06 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
Python中AND、OR的一个使用小技巧
2015/02/18 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
利用python实现微信头像加红色数字功能
2018/03/26 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
英国领先的在线高尔夫商店:Gamola Golf
2019/11/16 全球购物
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
大学生毕业的自我鉴定
2013/11/13 职场文书
管理科学大学生求职信
2013/11/13 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
学校后勤岗位职责
2014/02/19 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
活动总结新闻稿
2014/08/30 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
班主任2015新年寄语
2014/12/08 职场文书
项目技术负责人岗位职责
2015/04/13 职场文书
拖欠货款起诉状
2015/05/20 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
win10下go mod配置方式
2021/04/25 Golang
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android