生产者消费之模型就是,比如一个包子铺,中的顾客吃包子,和厨师做包子,
不可能是将包子一块做出来,在给顾客吃,但是单线程只能这麽做,
所以用多线程来执行,厨师一边做包子,顾客一边吃包子,
当顾客少时,厨师做的包子就放在一个容器中,等着顾客来吃,
当顾客多的时候,就从容器中先取出来给顾客吃,厨师继续做包子
用队列来模拟这个容器 1
# 当做完一个包子后就要给顾客发送一个信号,表示已经做完,让他们吃包子
import threading, time, queue
q = queue.Queue()
def Produce(name):
count = 0 # conut表示做的包子总个数
while count < 10:
print('厨师%s在做包子中...'%name)
time.sleep(2)
q.put(count) # 容器中添加包子
# 当做完一个包子后就要给顾客发送一个信号,表示已经做完,让他们吃包子
print('produce%s已经做好了第%s个包子'%(name, count))
count += 1
print('oking...')
def Consumer(name):
count = 0 # count表示包子被吃的总个数
while count < 10:
time.sleep(2) # 排队去取包子,
if not q.empty(): # 如果存在
data = q.get() # 取包子, 吃包子
print('\033[32;1mConsumer %s已经把第%s个包子吃了...\033[0m' %(name, data))
else:
print('包子被吃完了...')
count += 1
if __name__ == '__main__':
p1 = threading.Thread(target=Produce, args=('A君',))
c1 = threading.Thread(target=Consumer, args=('B君',))
c2 = threading.Thread(target=Consumer, args=('C君',))
c3 = threading.Thread(target=Consumer, args=('D君',))
p1.start()
c1.start()
c2.start()
c3.start()

2这里就是 当顾客吃完了然后给生产者发送一个信号
当生产者就接收到信号时,继续做包子
import threading, time, queue
q = queue.Queue() def Produce(name):
count = 0 # conut表示做的包子总个数
while count < 10:
print('厨师%s在做包子中...'%name)
time.sleep(2)
q.put(count) # 容器中添加包子
print('produce%s已经做好了第%s个包子'%(name, count))
count += 1 # q.task_done() # 当做完一个包子后就要给顾客发送一个信号,表示已经做完,让他们吃包子
q.join() #等待接收信号,
print('ok...')
def Consumer(name):
count = 0 # count表示包子被吃的总个数
while count < 10:
time.sleep(2)
# print('waiting...')
# q.join()
data = q.get() # 取包子, 吃包子
print('%seating...'%name)
time.sleep(4) # 吃包子用了4s然后给厨师发送一个信号
q.task_done() print('\033[32;1mConsumer %s已经把第%s个包子吃了...\033[0m' % (name, data))
# print('包子被吃完了...')
count += 1
if __name__ == '__main__':
p1 = threading.Thread(target=Produce, args=('A君',))
c1 = threading.Thread(target=Consumer, args=('B君',))
c2 = threading.Thread(target=Consumer, args=('C君',))
c3 = threading.Thread(target=Consumer, args=('D君',))
p1.start()
c1.start()
c2.start()
c3.start()
#利用同步对象也可以
event = threading.Event()
def Produce(name):
count = 0 # conut表示做的包子总个数
while count < 10:
print('厨师%s在做包子中...'%name)
time.sleep(2)
q.put(count) # 容器中添加包子
print('produce%s已经做好了第%s个包子'%(name, count))
event.set() # 等待接收信号,
count += 1 def Consumer(name):
count = 0
while count < 10:
# time.sleep(2)
event.wait()
data = q.get() # 取包子, 吃包子
print('%seating...'%name)
time.sleep(2) # 吃包子用了2s然后给厨师发送一个信号
print('\033[32;1mConsumer %s已经把第%s个包子吃了...\033[0m' % (name, data))
event.clear()
count += 1

利用同步对象event模拟信号

python实现生产者消费者模型的更多相关文章

  1. python之生产者消费者模型

    #Auther Bob #--*--conding:utf-8 --*-- #生产者消费者模型,这里的例子是这样的,有一个厨师在做包子,有一个顾客在吃包子,有一个服务员在储存包子,这个服务员我们就可以 ...

  2. Python多线程-生产者消费者模型

    用多线程和队列来实现生产者消费者模型 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" import threading imp ...

  3. (python)生产者消费者模型

    生产者消费者模型当中有两大类重要的角色,一个是生产者(负责造数据的任务),另一个是消费者(接收造出来的数据进行进一步的操作). 为什么要使用生产者消费者模型? 在并发编程中,如果生产者处理速度很快,而 ...

  4. python 之生产者消费者模型

    进程实现: import time,random from multiprocessing import Process,Queue def producer(name,q): count= 0 wh ...

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

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

  6. python生产者消费者模型

    业界用的比较广泛,多线程之间进行同步数据的方法,解决线程之间堵塞,互相不影响. server --> 生产者 client --> 消费者 在一个程序中实现又有生产者又有消费者 ,生产者不 ...

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

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

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

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

  9. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

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

随机推荐

  1. map、set 使用方法 | 1022 图书馆信息查询

    看了答案才知道了这题的各种骚操作,然后敲了一顿骚键盘,然后wa.调了很久,才发现要规格化打印……mdzz…… 注:加粗代码为傻逼规格化打印代码: #include <stdio.h> #i ...

  2. 2019CCPC网络预选赛 八道签到题题解

    目录 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 6702 & 6703 array 6704 K-th occurrence 6705 path 6706 huntian o ...

  3. MacbookPro升级10.15 Catalina之后无法读写NTFS

    冲着Sidecar的双屏功能,乐呵呵的跑去升级了10.15,结果就悲剧了. 所有移动硬盘和U盘都写不了,无奈只好上网找办法,目前找到一个便宜的方法: 共2步: Step 1:编写fstab文件 使用T ...

  4. Cobalt环境搭建及 Web开发注意事项

    一.在Linux系统上搭建Cobalt运行环境 Cobalt是一款开源轻量级HTML5/CSS/JS浏览器,旨在于用最少的CPU.GPU.RAM等资源消耗提供丰富的应用程序开发.为了使前端开发者验证自 ...

  5. 熟悉使用ssm框架完成项目

    羡慕那些一些博客就能写好多的人,总是能写的长篇大论的,而我就是简短的而且还伴随着语句不通顺等等,只写一点点,归根结底还是自己懒得写! 1.首先了解框架内容,拿到源码,先看配置文件 2.然后修改数据库建 ...

  6. 【网络知识之四】HTTP/2

    一.HTTP/1.1存在的问题 1.TCP 连接数限制2.线头阻塞 (Head Of Line Blocking) 问题3.Header 内容多,而且每次请求 Header 不会变化太多,没有相应的压 ...

  7. Linux基础及入门介绍

    一.linux发展历程 ①1969年unix诞生贝尔实验室 ②谭宁邦:minix unix ③斯托曼(stallman),公司:自由软件基金会(FSF) 项目:GNU 规则:GPL(所有人可以自由传播 ...

  8. 标签一致项(LC-KSVD)-全文解读

    Learning A Discriminative Dictionary for Sparse Coding via Label Consistent K-SVD 1,同步学习判决字典和线性分类器 2 ...

  9. Jenkins整合SonarQube

    一.概述 安装SonarQube,参考链接: https://www.cnblogs.com/xiao987334176/p/12011623.html 安装SonarQube Scanner,参考链 ...

  10. HTML+CSS学习笔记整理

    一.标签语义化(重点): 1.可以方便代码的阅读和维护 2.同时让网络爬虫更好的解析从而更好的分析其内容 3.更好的优化引擎 如何做到标签语义化:个人理解是,首先,网页的HTML主要作用在网页的结构上 ...