详解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 15:18:40
  • python中IO流和对象序列化详解

    2023-07-02 17:59:22
  • vue axios拦截器常用之重复请求取消

    2023-07-02 17:03:21
  • Python文件处理

    2022-08-08 10:22:01
  • Bootstrap table分页问题汇总

    2024-04-29 13:12:07
  • Python文件操作之合并文本文件内容示例代码

    2021-06-24 13:58:05
  • MySQL实现数据更新的示例详解

    2024-01-13 23:13:44
  • Python用正则表达式实现爬取古诗文网站信息

    2021-08-30 07:12:51
  • SQL Server常见问题及解决方法分享

    2024-01-15 01:45:30
  • Layui 数据表格批量删除和多条件搜索的实例

    2024-04-10 10:43:56
  • python读取各种文件数据方法解析

    2021-08-31 09:16:54
  • django 消息框架 message使用详解

    2021-06-21 17:22:29
  • Pytorch之parameters的使用

    2022-05-22 21:06:01
  • 如何在Django中设置定时任务的方法示例

    2023-03-21 06:19:07
  • Go应该如何实现二级缓存

    2024-02-19 17:07:53
  • TypeScript入门-接口

    2024-06-07 15:55:26
  • 通过表单的做为二进制文件上传request.totalbytes提取出上传的二级制数据

    2011-03-16 10:39:00
  • python实现三子棋游戏

    2021-11-20 04:10:37
  • bat和python批量重命名文件的实现代码

    2023-10-07 02:11:53
  • python datetime中strptime用法详解

    2022-03-08 19:31:48
  • asp之家 网络编程 m.aspxhome.com