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\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树莓派进程交互内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 树莓派升级python的具体步骤

    1.安装 python3 sudo apt install python3 2.卸载 python2.7 (可选) sudo apt remove python 3.再执行如下命令自动清理 python2.7 的依赖 sudo apt autoremove 4.删除掉原先 python 的链接 sudo rm /usr/bin/python 5.创建一个新的链接指向刚刚安装的 python3.5 sudo ln -s /usr/bin/python3.5 /usr/bin/python 内容扩展

  • 树莓派使用python-librtmp实现rtmp推流h264的方法

    目的是能使用Python进行rtmp推流,方便在h264帧里加入弹幕等操作. librtmp使用的是0.3.0,使用树莓派noir官方摄像头适配的. 通过wireshark抓ffmpeg的包一点点改动,最终可以在red5和斗鱼上推流了. 没怎么写过python,有不恰当的地方请包涵. 上代码: # -- coding: utf-8 -- # http://blog.csdn.net/luhanglei import picamera import time import traceback im

  • 树莓派4B+opencv4+python 打开摄像头的实现方法

    在树莓派自带得python IDE Thonny中写如下代码,并在树莓派上插上usb摄像头 import cv2 cap=cv2.VideoCapture(0) #调用摄像头'0'一般是打开电脑自带摄像头,'1'是打开外部摄像头(只有一个摄像头的情况) width=1280 height=960 cap.set(cv2.CAP_PROP_FRAME_WIDTH,width)#设置图像宽度 cap.set(cv2.CAP_PROP_FRAME_HEIGHT,height)#设置图像高度 #显示图像

  • 在树莓派2或树莓派B+上安装Python和OpenCV的教程

    我的Raspberry Pi 2昨天刚邮到,这家伙看上去很小巧可爱. 这小家伙有4核900MHZ的处理器,1G内存.要知道,Raspberry Pi 2 可比我中学电脑实验室里大多数电脑快多了. 话说,自从Raspberry Pi 2发布以来,我收到了很多请求,要求我能写一个在它上面安装OpenCV和Python的详细说明. 因此如果你想在Raspberry Pi启动运行OpenCV和Python,就往下面看! 在博文的剩余部分,我将提供在Raspberry Pi 2 和Raspberry Pi

  • 树莓派用python中的OpenCV输出USB摄像头画面

    本文实例为大家分享了python OpenCV来表示USB摄像头画面的具体代码,供大家参考,具体内容如下 确认Python版本 $ python Python 2.7.13 (default, Jan 19 2019, 14:48:08) [GCC 6.3.0 20170124] on linux2 Type "help", "copyright", "credits" or "license" for more inform

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

    写在前面 现在购物车有一任务需求,那就是需要进行图像识别和运动控制,因此需要初始化2个进程,从而分别完成相应的动作.因为运动控制需要图像识别的结果,因此现在就涉及到了python语法实现2个进程之间的协同合作,这篇博客就结合实际的python程序通过队列实现进程交互通过队列实现进程交互. 程序分析 首先介绍一下我们的需要的库函数: import time from multiprocessing import Process, Queue from multiprocessing import

  • python实现通过队列完成进程间的多任务功能示例

    本文实例讲述了python实现通过队列完成进程间的多任务功能.分享给大家供大家参考,具体如下: 1.通过队列完成进程间的多任务 import multiprocessing def download_data(q): """下载数据""" # 模拟从网上下载数据 data = [11, 22, 33, 44] # 向队列中写入数据 for temp in data: q.put(temp) print("----数据下载完成并且已存入队

  • Python多线程结合队列下载百度音乐的方法

    本文实例讲述了Python多线程结合队列下载百度音乐的方法.分享给大家供大家参考.具体如下: 一直想做个下载音乐的脚本,后来决定就拿百度音乐开刀,经过多次分析,终于制作了一个下载百度音乐的脚本,目前只默认下载第一页,童鞋们可以自由拓展. 适用Windows和Linux平台.依赖BeautifulSoup这个库,主要对HTML进行解析 #!/usr/bin/python # -*- coding: utf-8 -*- ''' 百度中批量下载某歌手的歌(目前只下载第一页,可以自行拓展) @autho

  • python实现在每个独立进程中运行一个函数的方法

    本文实例讲述了python实现在每个独立进程中运行一个函数的方法.分享给大家供大家参考.具体分析如下: 这个简单的函数可以同于在单独的进程中运行另外一个函数,这对于释放内存资源非常有用 #!/usr/bin/env python from __future__ import with_statement import os, cPickle def run_in_separate_process(func, *args, **kwds): pread, pwrite = os.pipe() pi

  • Python使用Supervisor来管理进程的方法

    本文实例讲述了Python使用Supervisor来管理进程的方法.分享给大家供大家参考.具体分析如下: Supervisor可以启动.停止.重启*nix系统中的程序.也可以重启崩溃的程序. supervisord的一个守护进程,用于将指定的进程当做子进程来运行. supervisorctl是一个客户端程序,可以查看日志并通过统一的会话来控制进程. 看例子: 我们写了一个py脚本,用于往log文件中记录一条当前的时间. root@ubuntu:/home/zoer# cat daemon.py

  • Python实现Linux下守护进程的编写方法

    本文实例讲述了Python实现Linux下守护进程的编写方法,分享给大家供大家参考,相信对于大家的Python程序设计会起到一定的帮助作用.具体方法如下: 1. 调用fork()以便父进程可以退出,这样就将控制权归还给运行你程序的命令行或shell程序.需要这一步以便保证新进程不是一个进程组头领进程(process group leader).下一步,'setsid()',会因为你是进程组头领进程而失败.进程调用fork函数时,操作系统会新建一个子进程,它本质上与父进程完全相同.子进程从父进程继

  • python 根据pid杀死相应进程的方法

    用python语言实现根据pid杀死相应进程 kill_process.py代码如下 #! /usr/bin/python # -*- coding: utf-8 -*- import os import sys import signal def kill(pid): try: a = os.kill(pid, signal.SIGKILL) # a = os.kill(pid, signal.9) # 与上等效 print '已杀死pid为%s的进程, 返回值是:%s' % (pid, a)

  • Python多进程入门、分布式进程数据共享实例详解

    本文实例讲述了Python多进程入门.分布式进程数据共享.分享给大家供大家参考,具体如下: python多进程入门 https://docs.python.org/3/library/multiprocessing.html 1.先来个简单的 # coding: utf-8 from multiprocessing import Process # 定义函数 def addUser(): print("addUser") if __name__ == "__main__&qu

  • 基于python的Linux系统指定进程性能监控思路详解

    监控Linux服务器的工具.组件和程序网上有很多,但是一台服务器上会有很多进程同时运行,特别是做性能测试的时候,可能一台服务器上部署多个服务,如果只监控整个服务器的CPU和内存,当某个服务出现性能问题时,并不能有效准确的定位出(当然通过其他工具也可以实现),因此,很有必要只监控指定的进程.需求明确了,于是动手撸了一个性能监控脚本. 一.整体思路 1.为了方便的启动监控和停止监控,在想查看监控结果的时候随时查看监控结果,用flask开启了一个服务,通过发送get请求可以随时启停监控和查看监控结果.

  • 在Python运行时动态查看进程内部信息的方法

    接前两篇"运行时查看线程信息"的博客,我在想,既然我可以随时打印线程信息,那么我是不是可以随时打印进程内部的其它信息呢?比如,实时查看一些对象属性等,这样可以帮助我们在不重新启动应用程序的情况下就可以观察进程的执行状态.(这里暂时不考虑那些使用第三方库或工具的情况) 根据这个想法,查看了一下python的动态加载模块的方法,感觉这个想法还是比较靠谱,应该可以实现,所以动手写了个小测试验证了一把.(这里说明一下,只是验证性的,生产环境要使用的话,还是有不少问题需要考虑的.) 下面就是测试

随机推荐