生产者消费之模型就是,比如一个包子铺,中的顾客吃包子,和厨师做包子,
不可能是将包子一块做出来,在给顾客吃,但是单线程只能这麽做,
所以用多线程来执行,厨师一边做包子,顾客一边吃包子,
当顾客少时,厨师做的包子就放在一个容器中,等着顾客来吃,
当顾客多的时候,就从容器中先取出来给顾客吃,厨师继续做包子
用队列来模拟这个容器 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. SQL Server 迁移数据库 (二)分离和附加

    分离和附加其实比导入和导出,步骤要少一些,但是数据量大的话,跨服务器拷贝数据文件可能要慢一些 1. 分离数据库 这里最好选择断开链接,断开之前要确保你记得数据库的路径,一般默认都是C:\Program ...

  2. Python--单元四练习

    一.算24 描述: 给出4个小于10的正整数,可以使用加.减.乘.除4种运算以及括号把4个数连接起来得到一个表达式.现在问题是,是否存在一种方式使得所得表达式的结果等于24.‪‬‪‬‪‬‪‬‪‬‮‬‪ ...

  3. [学习笔记] 网络最大流的HLPP算法

    #define \(u\)的伴点集合 与\(u\)相隔一条边的且\(u\)能达到的点的集合 \(0x00~ {}~Preface\) \(HLPP(Highest~Label~Preflow~Push ...

  4. MySQL实战45讲学习笔记:第二十八讲

    一.读写分离架构 在上一篇文章中,我和你介绍了一主多从的结构以及切换流程.今天我们就继续聊聊一主多从架构的应用场景:读写分离,以及怎么处理主备延迟导致的读写分离问题. 我们在上一篇文章中提到的一主多从 ...

  5. Express服务器开发

    作者 | Jeskson 来源 | 达达前端小酒馆 Express服务器开发 创建Express应用程序,Express路由,pug视图模板的使用 Express简介: 让我们来创建Express应用 ...

  6. [LeetCode] 241. Different Ways to Add Parentheses 添加括号的不同方式

    Given a string of numbers and operators, return all possible results from computing all the differen ...

  7. oracle--错误笔记(二)--ORA-16014

    ORA-16014错误解决办法 01.问题以及解决过程 SQL> select status from v$instance; STATUS ------------ MOUNTED SQL&g ...

  8. Visual Studio 调试系列5 检查变量(使用自动窗口和局部变量窗口)

    系列目录     [已更新最新开发文章,点击查看详细] 在调试时,“自动变量”和“局部变量”窗口会显示变量值. 仅在调试会话期间,这两个窗口才可用. “自动变量”窗口显示当前断点周围使用的变量. “局 ...

  9. Js apply方法与call方法详解 附ES6新写法

    我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...

  10. ASPNETCore开源日志面板 :LogDashboard

    LogDashboard logdashboard是在github上开源的aspnetcore项目, 它旨在帮助开发人员排查项目运行中出现错误时快速查看日志排查问题 通常我们会在项目中使用nlog.l ...