进程间通信ipc机制 生产者消费者模型(进程部分)

摘要:
Queue()里面只有一个maxsizemaxsize是队列中允许最大项数,省略则无大小限制q=Queueq.putq.putq.putput把数据放入Queue如果设置的maxsize是2那么程序会阻塞住等待有人把里面的数据取走再把最后一个存入这就相当于与管道+锁如果maxsize不设置参数表示Queue可以存很多值但不是无限的也有上限而且Queue存放消息类信息的小数据,不应该存放文件类的大数据。通知进程是使用共享的信号和条件变量来实现的。

IPC 机制有两种 一个是管道 一个是队列(队列=管道+锁)

管道用来实现两个进程连接进行通信

subprocess.Popen('tasklist',shell=True,) 就相当于 p=Process(target=tasklist) 只是发送一个信号出去 就是开一个子进程

主进程要想拿到子进程命令的运行结果,子进程的运行结果就是一堆数据,放在子进程的内存里,主进程要想拿就是子进程把运行结果丢到管道里面subprocess.Popen(‘tasklist’,shell=True,stdout=subprocess.PIPE) stdout 就是造了一个管道出来 子进程一旦运行就是把运行结果丢到管道里面 ,管道其实就是一个虚拟的共享空间,父进程想拿就直接去共享空间拿

队列 (先进先出) 需要使用到 from multiprocessing import Queue

Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。

Queue() 里面只有一个maxsize maxsize是队列中允许最大项数,省略则无大小限制

q=Queue(3)

q.put(2)

q.put({'x':2})

q.put(['22']) put 把数据放入Queue

如果设置的maxsize是2 那么程序会阻塞住 等待有人把里面的数据取走 再把最后一个存入这就相当于与管道+锁

如果maxsize不设置参数 表示Queue 可以存很多值 但不是无限的也有上限 而且Queue存放消息类信息的小数据,不应该存放文件类的大数据。

取出值就是 q.get() 因为是队列先进先出 先出来的是2 如果里面有两个值 但是有三个get 那么和上面一样阻塞

q.put 还有其他的参数 有block 默认是True block意思是锁 参数timeout 默认是-1 -1就是一直等待 意思是阻塞后等待时间 如果阻塞了过了timeout的时间那么会跑出异常

q.put_nowait 这个意思就是q.put(1,block=Flase) 直接不等待

q.get 和 q.get_nowait 和之前的一样 只是get timeout返回的是队列为空的异常

生产者消费者模型

 什么是生产者消费者模型
生产者:代指生产数据的任务
消费者:代指处理数据的任务
该模型的工作方式:
生产生产数据传递消费者处理
实现方式:
生产者---->队列<------消费者
为何要用
当程序中出现明细的两类任务,一类负责生产数据,一类负责处理数据
就可以引入生产者消费者模型来实现生产者与消费者的解耦合,平衡生产能力与消费能力,从提升效率

这是最终优化版本 下面链接内有一步步优化过程

http://www.cnblogs.com/linhaifeng/articles/7428874.html

#JoinableQueue([maxsize]):这就像是一个Queue对象,但队列允许项目的使用者通知生成者项目已经被成功处理。通知进程是使用共享的信号和条件变量来实现的。

#参数介绍:
 maxsize是队列中允许最大项数,省略则无大小限制。    
#方法介绍:
 JoinableQueue的实例p除了与Queue对象相同的方法之外还具有:
 q.task_done():使用者使用此方法发出信号,表示q.get()的返回项目已经被处理。如果调用此方法的次数大于从队列中删除项目的数量,将引发ValueError异常
 q.join():生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用q.task_done()方法为止

from multiprocessing import Process,JoinableQueue
import time,random,os
def consumer(q):
    while True:
        res=q.get()
        time.sleep(random.randint(1,3))
        print('

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇对象池技术和通用实现GenericObjectPoolKettle系列文章二(安装配置Kettle+SqlServer+简单的输入输出作业)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

TCP/IP协议分层模型(转载)

原文链接:https://juejin.im/post/6844903576930615309 一 连接人与人的计算机网络       计算机网络最初的目的是连续一个个独立的计算机, 使他们组成一个个更强有力的计算环境。简而言之,就是为了提高生产力。从批处理时代到计算机网络时代, 毋庸置疑,都体现了这一目的。然而,现在却似乎有了微妙的变化。      ...

【转】RS232/RS485/RS422 接口简介与编程

【转】RS-232/RS-485/RS-422 接口简介与编程 最近在调试两款产品时,问题都是出在了串口通信上。今天加班好不容易跟着把其中一款产品的串口接收数据的错误给调好了!回宿舍特地查了下资料,发现这篇文章对RS-232/RS-485/RS-422 的介绍还可以拿来一看。 一、什么是RS-232 接口? (1) RS-232 的历史和作用在串行通讯...

C# 实现WebSocket通信

  本实例可通过web网页端进行测试,下面直接上代码。   首先要在NuGet导入“Fleck”包,.net framework4以上版本都可以选择。 using System; using System.Collections.Generic; using System.Linq; using System.Threading; namespace...

Android系统Binder机制学习总结

一、Binder机制概述 在Android开发中,很多时候我们需要用到进程间通信,所谓进程间通信,实现进程间通信的机制有很多种,比如说socket、pipe等,Android中进程间通信的方式主要有三种: 1.标准Linux Kernel IPC 接口; 2.标准D-BUS接口; 3.Binder接口。 其中,Binder机制是使用最且最被认可的,因为Bi...

TCP与UDP区别详解

TCP与UDP区别详解 计算机与其他网络设备相互通信,通信的双方在发送和接收数据包时必须基于相同的规则(例如:如何找到通信目标、如何发起通信、如何结束通信等规则都需要事先确定),我们将这种规则称为协议(Protocol)。 TCP/IP协议簇是 Internet 的基础,其是一系列网络协议的总称,例如:TCP、UDP、IP、FTP、HTTP、ICMP、SM...

《Python》并发编程

手工操作 —— 穿孔卡片       1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式。此时还没有操作系统的概念。             程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果...