一、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. 使用Future

    /** * Runnable接口有个问题,它的方法没有返回值.如果任务需要一个返回结果,那么只能保存到变量,还要提供额外的方法读取,非常不便. * Java标准库还提供了一个Callable接口,和R ...

  2. Docker入门-笔记-1

    Docker入门 Docker 是 Golang 编写的, 自 2013 年推出以来,受到越来越多的开发者的关注.如果你关注最新的技术发展,那么你一定听说过 Docker.不管是云服务还是微服务(Mi ...

  3. echart的legend不显示问题

    legend的data与series的name 两者必须同时存在,且数量和文字内容必须一致.

  4. Dynamics 365 Portal 修改注册页面及Profile页面

    一,Profile页面 客户要求在Portal Profile页面上添加性别字段,通过查看源代码发现,中间的联系人信息部分是引用的CRM中Contact实体的Portal Web Form表单,直接把 ...

  5. Hack the Breach 2.1 VM (CTF Challenge)

    主机扫描: ╰─ nmap -p- -A 192.168.110.151Starting Nmap 7.70 ( https://nmap.org ) at 2019-08-29 09:48 CSTN ...

  6. 第01讲 Android开发系列---Activity

    一.  Android系统版本及详细信息 最新数据  https://developer.android.com/about/dashboards/ 二.  Android项目初探 1.    使用a ...

  7. 百度大脑UNIT3.0详解之嵌入式对话理解技术

    相信很多人都体验过手机没有网时的焦虑,没有网什么也做不了.而机器人也会遇到这样的时刻,没有网或者网络环境不好的情况下,无法识别用户在说什么,也无法回复用户.在AIoT(AI+物联网)飞速普及的现在,智 ...

  8. sql server的简单分页

    --显示前条数据 select top(4) * from students; --pageSize:每页显示的条数 --pageNow:当前页 )) sno from students); --带条 ...

  9. JavaScript图形实例:四瓣花型图案

    设有坐标计算公式如下: X=L*(1+SIN(4α))*COS(α) Y=L*(1+SIN(4α))*SIN(α) 用循环依次取α值为0~2π,计算出X和Y,在canvas画布中对坐标位置(X,Y)描 ...

  10. glusterFS空间不够了怎么办

    查看glusterFS情况 oc project infra-storage oc get all #找到其中一个pod,前缀为 po/glusterfs-registry-xxxx oc exec ...