• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python树莓派通过队列实现进程交互的程序分析
    POST TIME:2021-10-18 13:20

    写在前面

    现在购物车有一任务需求,那就是需要进行图像识别和运动控制,因此需要初始化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函数里面只是做了线程启动的操作,我们再来看一下输出结果:

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

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

    您可能感兴趣的文章:
    • 树莓派升级python的具体步骤
    • 树莓派4B+opencv4+python 打开摄像头的实现方法
    • 树莓派使用python-librtmp实现rtmp推流h264的方法
    • 树莓派用python中的OpenCV输出USB摄像头画面
    • 在树莓派2或树莓派B+上安装Python和OpenCV的教程
    上一篇:Python多线程 Queue 模块常见用法
    下一篇:Django REST framework 异常处理
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信