一、ipc机制 进程通讯

管道:pipe 基于共享的内存空间

队列:pipe+锁 queue

下面拿代码来实现Queue如何使用:

案例一:

from multiprocessing import Queue
q = Queue() # 实例产生一个q队列
q.put('蔡徐坤') # 将括号内的数据加入队列中,先进先出
q.put([1,2,3])
q.put(3)
print(q.get()) # 将队列里的数据取出来,先进先出
print(q.get())
print(q.get())
# q.put(5)
print(q.get()) # 如果队列里面没有值,就会一直等待队0列有值。

案例二:

from multiprocessing import Queue
q = Queue(4) # 4 代表队列最大项数为4,不写则为无限制大小
q.put('蔡徐坤') # 将括号内的数据加入队列中,先进先出
q.put([1,2,3])
q.put(3)
q.put(3)
q.put(3) # 队列满了的话,会阻塞,等待q.get()放值后,才能加入队列

案例三:(从这往下都是了解)

from multiprocessing import Queue
q = Queue(3)
q.put('zhao')
q.put('zhao')
q.put('zhao') q.put('zhao',block=True,timeout=5) # put里的 block=True(默认) 如果满了会等待,timeout最多等待n s,如果ns还是队列还是满的就报错了,如果block=False,队列满了直接报错。

案例四:

from multiprocessing import Queue
q = Queue()
q.put('yyyy')
q.get()
q.get(block=True,timeout=5) # block=True 阻塞等待,timeout最多等5s, 剩下同上

案例五:

from multiprocessing import Queue
q = Queue(3)
q.put('qwe')
q.put('qwe')
q.put('qwe')
q.put('qwe',block=False) # 对于put来说block=False 如果队列满了就直接报错 q = Queue(3)
q.put('qwe')
q.get()
q.get(block=False) # 对于get来说:block = Flase 拿不到不阻塞,直接报错

案例六:

from multiprocessing import Queue
q = Queue(1)
q.put('123')
q.get()
q.put_nowait('666') # 相当于block = False
q.get_nowait() # block = False


二、生产者消费者模型:

​ 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度

2.1 为什么要使用生产者和消费者模式?

​ 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。

2.2什么是生产者消费者模式?

​ 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

简述:

​ 生产者: 生产数据的任务

​ 消费者: 处理数据的任务

​ 生产者--队列(盆)-->消费者

​ 生产者可以不停的生产,达到了自己最大的生产效率,消费者可以不停的消费,也达到了自己最大的消 费效率.

​ 生产者消费者模型大大提高了生产者生产的效率和消费者消费的效率.

​ 补充: queue不适合传大文件,通产传一些消息.

生产者消费者模型一:

from multiprocessing import Process,Queue

def producer(q,name,food):
'''生产者'''
for i in range(10):
print(f'{name}生产了{food}{i}')
res = f'{food}{i}'
q.put(res)
q.put(None) # 发送结束信号 def consumer(q,name):
'''消费者'''
while True:
res = q.get(timeout=5)
if res is None:
break
print(f'{name}吃了{res}') if __name__ == '__main__':
q=Queue()
p1 = Process(target=producer,args=(q,'蔡徐坤','包子'))
c1 = Process(target=consumer,args=(q,'周琦'))
p1.start()
c1.start()
# p1.join()
# q.put(None) # 不一定由生产者发送结束信号,也可以由主进程来发送

多个消费者例子:有几个消费者就需要发送几次结束信号:

from multiprocessing import Process,Queue
import time,random def producer(q,name,food):
'''生产者'''
for i in range(3):
print(f'{name}生产了{food}{i}')
time.sleep(random.randint(1,3))
res = f'{food}{i} '
q.put(res) def consumer(q,name):
'''消费者'''
while True:
res = q.get(timeout=5)
if res is None:
break
time.sleep(random.randint(1,3))
print(f'{name}吃了{res}') if __name__ == '__main__':
q =Queue()
p1 = Process(target=producer,args=(q,'蔡徐坤','包子'))
p2 = Process(target=producer,args=(q,'周琦','手抓饼'))
p3 = Process(target=producer,args=(q,'吴亦凡','羊肉串'))
c1 = Process(target=consumer,args=(q,'叶问'))
c2 = Process(target=consumer,args=(q,'黄飞鸿'))
p1.start()
p2.start()
p3.start()
c1.start()
c2.start() p1.join()
p2.join()
p3.join() # 生产者生产完毕
q.put(None) # 几个消费者就put几次None
q.put(None)

JoinableQueue队列实现消费者生产者模型:

from multiprocessing import Process,JoinableQueue
import time,random def producer(q,name,food):
'''生产者'''
for i in range(3):
print(f'{name}生产了{food}{i}')
time.sleep(random.randint(1,3))
res = f'{food}{i} '
q.put(res) def consumer(q,name):
'''消费者'''
while True:
res = q.get(timeout=5)
time.sleep(random.randint(1,3))
print(f'{name}吃了{res}')
q.task_done() #向q.join()发送一次信号,证明一个数据已经被取走了 if __name__ == '__main__':
q =JoinableQueue()
p1 = Process(target=producer,args=(q,'蔡徐坤','包子'))
p2 = Process(target=producer,args=(q,'周琦','手抓饼'))
p3 = Process(target=producer,args=(q,'吴亦凡','羊肉串'))
c1 = Process(target=consumer,args=(q,'叶问'))
c2 = Process(target=consumer,args=(q,'黄飞鸿'))
p1.start()
p2.start()
p3.start() c1.daemon = True # 定义消费者为守护进程
c2.daemon = True
c1.start()
c2.start() p1.join()
p2.join()
p3.join() # 生产者生产完毕
# q.put(None) # 几个消费者就put几次None
# q.put(None)
q.join() # 生产完毕,使用此方法进行阻塞,直到队列中所有项目均被处理。
# 分析:
# 生产者生产完毕---》消费者已经取干净了---》q.join()消费者已经取干净了,没有存在的意义了
# 这是主进程最后一行代码结束,消费者已经取干净了,没有存在的意义了.守护进程的概念. # 分析2:
# #主进程等--->p1,p2,p3等---->c1,c2
# #p1,p2,p3结束了,证明c1,c2肯定全都收完了p1,p2,p3发到队列的数据
# #因而c1,c2也没有存在的价值了,不需要继续阻塞在进程中影响主进程了。应该随着主进程的结束而结束,所以设置成守护进程就可以了。

多进程操作-进程队列multiprocess.Queue的使用的更多相关文章

  1. 多进程操作-进程锁multiprocess.Lock的使用

    多进程操作-进程锁multiprocess.Lock的使用 ​ 通过之前的Process模块的学习,我们实现了并发编程,虽然更加充分地利用了IO资源,但是也有缺陷:当多个进程共用一份数据资源的时候,就 ...

  2. Python程序中的进程操作-进程池(multiprocess.Pool)

    目录 一.进程池 二.概念介绍--multiprocess.Pool 三.参数用法 四.主要方法 五.其他方法(了解) 六.代码实例--multiprocess.Pool 6.1 同步 6.2 异步 ...

  3. Python程序中的进程操作-进程间通信(multiprocess.Queue)

    目录 一.进程间通信 二.队列 2.1 概念介绍--multiprocess.Queue 2.1.1 方法介绍 2.1.2 其他方法(了解) 三.代码实例--multiprocess.Queue 3. ...

  4. multiprocess模块---进程---进程队列

    首先明白几个概念: 同步:做完一件事情,再做另外一件事情 异步:做一件事情的时候,可以再做另外一件事情 阻塞:recv  sleep accept input recvfrom 非阻塞:没有遇见上面这 ...

  5. 进程间通信——队列和管道(multiprocess.Queue、multiprocess.Pipe)

    进程: 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运 ...

  6. 2.Python进程间的通信之队列(Queue)和生产者消费者模型

    一.队列 1.1 概念介绍-----multiprocess.Queue 创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递. Queue([maxsize] ...

  7. 进程之间的通信(multiprocess.Queue)

    一.进程间通信 进程之间的数据是相互隔离的,例如 from multiprocessing import Process def task(): global n # 声明全局变量 n = 999 p ...

  8. Python 多进程和进程池

    一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是 ...

  9. 5 并发编程-(进程)-队列&生产者消费者模型

    1.队列的介绍 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 创建队列的类(底层就是以管道和锁定的方式实现 ...

随机推荐

  1. Power Platform之Power Automate新增RPA功能

    ​ 什么是RPA RPA( Robotic Process Automation 机器人流程自动化软件),是一种新型的人工智能的虚拟流程自动化机器人.RPA的核心是通过自动化.智能化技术来“替代人”进 ...

  2. CCF-CSP题解 201709-3 JSON查询

    要求写一个小程序完成JSON查询的功能. 查询dfs就好了. 存储JSON对象用图(树)就好,把\(<key[],type,val[]>\)作为节点,然后又是字符串处理了. 其实就是个简化 ...

  3. 运用Java调用Kettle Job和Trans(带参数)

    1.首先创建一个kettle trans 2.对表输入进行编辑 ${dateNow}为要传入的参数. 3.代码编写 首先需要把包导入 import org.pentaho.di.core.Kettle ...

  4. Linux Bash文本操作之grep篇

    Linux grep命令用于查找文件里符合条件的字符串.是文本检索中常用的工具之一. grep  指令在文件中查找能够匹配指定模式字符串的行.如果没有指定文件名,或者文件名为  -  ,则从标准输入设 ...

  5. TrueTime的安装、运行例程

    一.前言 Truetime的安装是为了完成课程相关需求,但在安装过程中遇到一些问题,想到自己之前注册了博客所以打算把这个作为第一篇的内容.请放心这个的安装过程并不困难,可以放心食用. 二.准备 Tru ...

  6. Docker network整理

    一.简介 默认情况下容器与容器.容器与宿主机的网络是隔离开来的, 当你安装docker的时候,docker会创建一个桥接器docker0,通过它才让容器与容器.容器与宿主机之间通信. Docker安装 ...

  7. 原生JS实现移动端轮播图

    功能描述: 自动无缝轮播图片,底部小圆点跟图片保持一致:手指左右移动轮播图,移动距离大于50px播放下一张(或上一张),小于50px则回弹 具体功能实现: 1.定时器 自动轮播图片 先声明一个inde ...

  8. ts--泛型

    //泛型:软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性,组件不仅要能支持当前的数据类型,同时也能支持未来的数据类型 //泛型就是解决 类  接口  方法的复用性 以及对不特定 ...

  9. SpringBoot2 整合 Drools规则引擎,实现高效的业务规则

    本文源码:GitHub·点这里 || GitEE·点这里 一.Drools引擎简介 1.基础简介 Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的 ...

  10. java 编译时注解框架 lombok-ex

    lombok-ex lombok-ex 是一款类似于 lombok 的编译时注解框架. 编译时注,拥有运行时注解的便利性,和无任何损失的性能. 主要补充一些 lombok 没有实现,且自己会用到的常见 ...