#1、队列的数据是安全的,因为队列内置了一把锁,大家都来抢占资源的时候,A在操作数据的时候,B就无法操作该数据。
# 下面代码有两个生产者和三个消费者,包子吃完之后,接着放的两个None被marry和alex吃到了,所以吃饱了,剩下的牛奶,tom吃完。
# 放在队列里面的None的数量需要根据生产者和消费者的数量来计算,很不方便。
from multiprocessing import Process
from multiprocessing import Queue
import time
import random
def producer(q,food):
for i in range(5):
time.sleep(random.random())
q.put('%s-%s'%(food,i))
print('%s-%s'%(food,i))
q.put(None) #因为有三个消费者,需要三个None才能让consumer方法的循环结束。
q.put(None) #两个生产者有4个None def consumer(q,name):
while True: #消费者要处理多少数据是不确定的,所以使用while循环。
food = q.get()
if food == None:
print('%s吃饱了'%name)
break #while是无法结束的,所以需要生产者发送None信号。这个信号的数量
print('%s吃了%s'%(name,food))#是根据生产者和消费者的数量来计算的,所以很不方便。 if __name__ == '__main__':
q = Queue()
p = Process(target=producer,args=(q,'包子'))
p.start()
p1 = Process(target=producer,args=(q,'牛奶'))
p1.start()
c = Process(target=consumer,args=(q,'alex'))
c.start()
c1 = Process(target=consumer,args=(q,'marry'))
c1.start()
c2 = Process(target=consumer,args=(q,'tom'))
c2.start()
# 牛奶-0
# alex吃了牛奶-0
# 包子-0
# tom吃了包子-0
# 包子-1
# marry吃了包子-1
# 包子-2
# alex吃了包子-2
# 牛奶-1
# tom吃了牛奶-1
# 包子-3
# marry吃了包子-3
# 牛奶-2
# alex吃了牛奶-2
# 包子-4
# tom吃了包子-4
# marry吃饱了
# alex吃饱了
# 牛奶-3
# tom吃了牛奶-3
# 牛奶-4
# tom吃了牛奶-4
# tom吃饱了 #2、使用JoinableQueue(数据也是安全的),避免计算None的信号数量的麻烦:
#流程:数据全部被消费--->生产进程结束--->主进程结束--->消费守护进程结束。
from multiprocessing import Process
from multiprocessing import JoinableQueue
import time
import random
def producer(q,food):
for i in range(5):
time.sleep(random.random())
q.put('%s-%s'%(food,i))
print('%s-%s'%(food,i))
q.join() #等待数据全部被消费,当包子和牛奶全部被吃完,下面的q.task_done()会发送完成的信号给q.join(),
#q.join()收到信号之后,就不再阻塞,这样这个生产的进程就结束了。 def consumer(q,name):
while True:
food = q.get()
print('%s吃了%s'%(name,food))
q.task_done() if __name__ == '__main__':
q = JoinableQueue()
p = Process(target=producer,args=(q,'包子'))
p.start()
p1 = Process(target=producer,args=(q,'牛奶'))
p1.start()
c = Process(target=consumer,args=(q,'alex'))
c.daemon = True
c.start()
c1 = Process(target=consumer,args=(q,'marry'))
c1.daemon = True
c1.start()
c2 = Process(target=consumer,args=(q,'tom'))
c2.daemon = True
c2.start()#p.join()和p1.join(),阻塞等待,主进程等待子进程结束之后才结束。
p.join() #生产的进程结束以后,p.join()和p1.join()也结束了,那么if语句下面的主进程都结束了,
p1.join()#接着消费者作为守护进程也随着主进程的结束而结束(循环结束)。这样就不需要计算None的信号数量了。 #3、func因为睡眠了1秒,陷入阻塞,系统会让func1先执行,然后func才执行。
from multiprocessing import Process
import time def func():
time.sleep(1)
print('') def func1():
print('') if __name__ == '__main__':
p = Process(target=func)
p.start()
p1 = Process(target=func1)
p1.start()
#
# #4、因为设置了队列,就算func设置了睡眠1秒,也不会阻塞:
from multiprocessing import Process
from multiprocessing import Queue
import time def func(q):
time.sleep(1)
q.put('')
print('get1') def func1(q):
print(q.get())
print('') if __name__ == '__main__':
q = Queue()
p = Process(target=func,args=(q,))
p.start()
p1 = Process(target=func1,args=(q,))
p1.start()
# get1
#
#

day40-进程-生产者消费者模型进阶的更多相关文章

  1. 利用multiprocessing.managers开发跨进程生产者消费者模型

    研究了下multiprocessing.managers,略有收获,随笔一篇: 核心思路是构造一个manager进程,这个进程可以通过unix socket或tcp socket与其它进程通信:因为利 ...

  2. Python学习笔记——进阶篇【第九周】———线程、进程、协程篇(队列Queue和生产者消费者模型)

    Python之路,进程.线程.协程篇 本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Ev ...

  3. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  4. python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

    一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...

  5. 进程部分(IPC机制及生产者消费者模型)和线程部分

    进程部分 一:进程间通信IPC机制:由于进程之间的内存空间是相互隔离的,所以为了进程间的通信需要一个共享的内存空间, 但是共享带来的问题是数据在写的时候就不安全了,所以需要一种机制既有能共享的内存 空 ...

  6. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  7. Python_生产者消费者模型、管道、数据共享、进程池

    1.生产者消费者模型 生产者 —— 生产数据的人 消费者 —— 消费数据的人 生产者消费者模型:供销数据不平衡的现象. import time import random from multiproc ...

  8. python 进程锁 生产者消费者模型 队列 (进程其他方法,守护进程,数据共享,进程隔离验证)

    #######################总结######### 主要理解 锁      生产者消费者模型 解耦用的   队列 共享资源的时候 是不安全的 所以用到后面的锁 守护进程:p.daem ...

  9. Learning-Python【34】:进程之生产者消费者模型

    一.什么是生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务,在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样 ...

随机推荐

  1. 用ps画一个Gif的小房子(1)

    效果如图: 制作方法: 1.新建200*200的画布:复制一块小房子图片 2.点击窗口-时间轴-勾选帧动画 3.如图所示(我这边是一帧对应一个图层) 4.新建图层-这边要新建24个图层,每个图层对应不 ...

  2. Mybatis实现增删改查(二)

    1. 准备 请先完成Mybatis基本配置(一)的基本内容 2. 查询多条商品信息 1)在com.mybatis.dao.PartDao中增加接口函数 public List<PartInfo& ...

  3. GPU 、APU、CUDA、TPU、FPGA介绍

    购买显卡主要关注:显存.带宽和浮点运算数量   GPU :图形处理器(英语:Graphics Processing Unit,缩写:GPU),又称显示核心.视觉处理器.显示芯片,是一种专门在个人电脑. ...

  4. 两个exe共享内存数据

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  5. 直击JDD | 徐雷:智能化零售,以技术为驱动力的突破路径

    "京东零售已经成为一家典型的以技术驱动为主的零售公司".在11月19日召开的 2019京东全球科技探索者大会上,京东零售集团CEO徐雷首次阐释了京东零售的智能化零售路径. 徐雷指出 ...

  6. Block实现代理/通知效果

    例子1:A控制器->跳转—>B控制器 , 假设想从B控制器回传数组给A控制器 实现:B控制器.h文件定义一个block参数,.m文件执行block,A控制器设置block内容 B.h文件/ ...

  7. 本地搭建3节点kubernetes

    kubernetes本地搭建版本选择 CentOS Linux release 7.7.1908 kubernetesVersion: v1.17.0 weave-kube:2.6.0 ceph/ce ...

  8. redis在linux中的安装启动

    1. 拖到 /usr/local 下 2. 解压 tar zxf redis-4.0.8.tar.gz 3. mkdir /usr/redis 4. 编译     cd redis-4.0.8/src ...

  9. zookeeper以及集群的搭建

    今天我来写一写zookeeper集群的搭建流程 1.zookeeper的搭建不难,难的是对他的理解以及良好的使用.单机版的zookeeper只需要解压后直接命令 启动即可 解压zookeeper,ta ...

  10. G6:AntV 的图可视化与图分析

    导读 G6 是 AntV 旗下的一款专业级图可视化引擎,它在高定制能力的基础上,提供简单.易用的接口以及一系列设计优雅的图可视化解决方案,是阿里经济体图可视化与图分析的基础设施.今年 AntV 11. ...