详解Python 模拟实现生产者消费者模式的实例

作者:qindongliang1922 时间:2022-04-17 10:35:51 

详解Python 模拟实现生产者消费者模式的实例

散仙使用python3.4模拟实现的一个生产者与消费者的例子,用到的知识有线程,队列,循环等,源码如下:

Python代码


import queue
import time
import threading
import random

q=queue.Queue(5)

#生产者
def pr():
 name=threading.current_thread().getName()
 print(name+"线程启动......")
 for i in range(100):
   t=random.randint(2,9)
   print(name,"睡眠时间: ",t)
   time.sleep(t);
   d="A"+str(i)
   print(name+"正在存第",i+1,"个数据: ",d)
   #q.put("A"+str(i),False,2000)
   q.put(d)
 print("生产完毕!")

#消费者
def co():
 name=threading.current_thread().getName()
 time.sleep(1)
 print(name+"线程启动......")

while True:
   print(name+"检测到队列数量: ",q.qsize())
   t=random.randint(2,9)
   print(name,"睡眠时间: ",t)
   data=q.get();
   print(name+"消费一个数据: ",data)

p=threading.Thread(target=pr,name="生产者")
c=threading.Thread(target=co,name="消费者1")
c2=threading.Thread(target=co,name="消费者2")

p.start()
c.start()
c2.start()

在本例里面散仙启动了1个生产者线程,2个消费者线程,打印效果如下:

Python代码 


生产者线程启动......
生产者 睡眠时间: 4
消费者1线程启动......
消费者1检测到队列数量: 0
消费者1 睡眠时间: 2
消费者2线程启动......
消费者2检测到队列数量: 0
消费者2 睡眠时间: 3
生产者正在存第 1 个数据: A0
生产者 睡眠时间: 9
消费者1消费一个数据: A0
消费者1检测到队列数量: 0
消费者1 睡眠时间: 8
生产者正在存第 2 个数据: A1
生产者 睡眠时间: 5
消费者2消费一个数据: A1
消费者2检测到队列数量: 0
消费者2 睡眠时间: 7
生产者正在存第 3 个数据: A2
生产者 睡眠时间: 8
消费者1消费一个数据: A2
消费者1检测到队列数量: 0
消费者1 睡眠时间: 2
生产者正在存第 4 个数据: A3
生产者 睡眠时间: 7
消费者2消费一个数据: A3
消费者2检测到队列数量: 0
消费者2 睡眠时间: 9
生产者正在存第 5 个数据: A4
生产者 睡眠时间: 2
消费者1消费一个数据: A4
消费者1检测到队列数量: 0
消费者1 睡眠时间: 5
生产者正在存第 6 个数据: A5
生产者 睡眠时间: 5
消费者2消费一个数据: A5
消费者2检测到队列数量: 0
消费者2 睡眠时间: 6
生产者正在存第 7 个数据: A6
生产者 睡眠时间: 7
消费者1消费一个数据: A6
消费者1检测到队列数量: 0
消费者1 睡眠时间: 7
生产者正在存第 8 个数据: A7
生产者 睡眠时间: 3
消费者2消费一个数据: A7
消费者2检测到队列数量: 0
消费者2 睡眠时间: 8
生产者正在存第 9 个数据: A8
生产者 睡眠时间: 2
消费者1消费一个数据: A8
消费者1检测到队列数量: 0
消费者1 睡眠时间: 4
生产者正在存第 10 个数据: A9
生产者 睡眠时间: 4
消费者2消费一个数据: A9
消费者2检测到队列数量: 0
消费者2 睡眠时间: 5
生产者正在存第 11 个数据: A10
生产者 睡眠时间: 2
消费者1消费一个数据: A10
消费者1检测到队列数量: 0
消费者1 睡眠时间: 3
生产者正在存第 12 个数据: A11
生产者 睡眠时间: 3
消费者2消费一个数据: A11
消费者2检测到队列数量: 0
消费者2 睡眠时间: 3
生产者正在存第 13 个数据: A12
生产者 睡眠时间: 3
消费者1消费一个数据: A12
消费者1检测到队列数量: 0
消费者1 睡眠时间: 3
生产者正在存第 14 个数据: A13
生产者 睡眠时间: 8
消费者2消费一个数据: A13
消费者2检测到队列数量: 0
消费者2 睡眠时间: 7
生产者正在存第 15 个数据: A14
生产者 睡眠时间: 3
消费者1消费一个数据: A14
消费者1检测到队列数量: 0
消费者1 睡眠时间: 7
生产者正在存第 16 个数据: A15
生产者 睡眠时间: 2
消费者2消费一个数据: A15
消费者2检测到队列数量: 0
消费者2 睡眠时间: 9

从这个例子中,我们发现利用队列,来做同步时非常简单方便的,除此之外队列,还有如下几个方便的方法:

介绍一下此包中的常用方法:   


Queue.qsize() 返回队列的大小  
Queue.empty() 如果队列为空,返回True,反之False  
Queue.full() 如果队列满了,返回True,反之False
Queue.full 与 maxsize 大小对应  
Queue.get([block[, timeout]])获取队列,timeout等待时间  
Queue.get_nowait() 相当Queue.get(False)
非阻塞 Queue.put(item) 写入队列,timeout等待时间  
Queue.put_nowait(item) 相当Queue.put(item, False)
Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号
Queue.join() 实际上意味着等到队列为空,再执行别的操作

来源:http://qindongliang.iteye.com/blog/2115950

标签:Python,生产者,消费者
0
投稿

猜你喜欢

  • Python中列表的基本操作汇总

    2021-08-20 23:21:27
  • Python 中判断列表是否为空的方法

    2023-10-25 13:19:12
  • Python实现归一化算法详情

    2023-05-11 12:18:33
  • 自学python的建议和周期预算

    2021-10-07 04:38:09
  • 网页编辑常用表现的实现方法

    2010-07-02 16:24:00
  • Python实现获取磁盘剩余空间的2种方法

    2023-11-20 23:53:29
  • 实例讲解Python中整数的最大值输出

    2021-12-20 22:04:39
  • Refactoring HTML 书评

    2008-07-10 12:00:00
  • 基于Python制作一个汇率换算程序

    2022-05-25 20:33:25
  • GO语言操作Elasticsearch示例分享

    2023-09-03 03:38:00
  • python数据可视化绘制火山图示例

    2022-05-08 03:47:56
  • 奇淫技巧和西天取经

    2009-08-24 12:34:00
  • 一文带你重温一下Python的对象模型

    2022-09-15 15:52:52
  • php巧获服务器端信息

    2023-10-04 02:18:39
  • 详解Python 正则表达式模块

    2022-03-26 21:26:34
  • python数字图像处理环境安装与配置过程示例

    2023-03-05 07:00:25
  • Python多个装饰器的调用顺序实例解析

    2021-09-30 06:54:56
  • python中数组和矩阵乘法及使用总结(推荐)

    2021-11-30 04:29:31
  • Golang排列组合算法问题之全排列实现方法

    2023-07-14 14:16:19
  • CSS改变字体而不影响网页

    2010-10-20 20:11:00
  • asp之家 网络编程 m.aspxhome.com