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

    https://blog.csdn.net/WZZ18191171661/article/details/91305466 https://blog.csdn.net/qq_25352981/arti ...

  2. [LeetCode] 24. Swap Nodes in Pairs 成对交换节点

    Given a linked list, swap every two adjacent nodes and return its head. You may not modify the value ...

  3. WPF CoboxItem控件使用SelectedItem去调System.Windows.Controls.ComboBoxItem: 前缀方法

    textComBox.SelectedItem as ComboBoxItem).Content textConbox: 控件Combobox 的Name 在Combobox控件SelectionCh ...

  4. 多模态数据联合Embedding的方法小结

    当模型需要接受多个模态的数据时,往往需要设计合适的方法让他们能进行信息的融合,Joint embedding是一种较为普遍的思路,即将他们映射到同一个向量空间中,再进行融合. 向量拼接.元素级相乘.做 ...

  5. js中的require、define、export、import【转】

    原文链接:https://www.cnblogs.com/libin-1/p/7127481.html 为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. ...

  6. Windows&Mac安装Redis

    Windows&Mac安装Redis Window 下安装Redis Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择,这里我下载 Redis-x64-xxx.zi ...

  7. Visual Studio 调试系列3 断点

    系列目录     [已更新最新开发文章,点击查看详细] 断点是开发人员的工具箱中最重要的调试技术之一. 若要暂停调试程序执行所需的位置设置断点. 例如,你可能想要查看代码变量的状态或查看调用堆栈的某些 ...

  8. python 根据文件的编码格式读取文件

    因为各种文件的不同格式,导致导致文件打开失败,这时,我们可以先判断文件的编码吗格式,然后再根据文件的编码格式进行读取文件 举例:有一个data.txt文件,我们不知道它的编码格式,现在我们需要读取文件 ...

  9. 互联网基础知识------OSI七层网络模型梗概

    OSI七层模型 七层网络结构: 应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 一般也作五层 应用层.传输层.网络层.数据链路层.物理层(实体层) 引申问题:TCP/IP协议与http协议 ...

  10. golang --os系统包

    环境变量 Environ 获取所有环境变量, 返回变量列表 func Environ() []string package main import ( "fmt" "os ...