Python实现的生产者、消费者问题完整实例


Posted in Python onMay 30, 2018

本文实例讲述了Python实现的生产者、消费者问题。分享给大家供大家参考,具体如下:

生产者、消费者问题,经典的线程同步问题:假设有一个缓冲池(列表),生产者往里面放东西,消费者从里面取,规则是:列表为空的时候,生产者才能放东西;列表不为空的时候,消费者才能取东西;为了简单起见,暂定缓冲池中最多只能有一个产品。这里生产者和消费者共同操作一个资源:缓冲池,因此每次操作的时候,需要给资源加锁,操作结束时,释放锁,这样才能做到资源同步。使用python实现,需要继承Thread类,获取锁对象,代码如下:

# -*- coding:utf-8 -*-
#! python2
from threading import Thread
from threading import Lock
import time,random
pro_list = []
lock = Lock()
class Producer(Thread):
  def run(self):
    global pro_list
    while True:
      i = random.randint(0, 100)
      lock.acquire()
      if len(pro_list) > 0:
        print "!--product still in list, wait consumer to get it.."
      else:
        pro_list.append(i)
        print ":::Producer put:", pro_list[0]
      lock.release()
      time.sleep(2)
class Consumer(Thread):
  def run(self):
    global pro_list
    while True:
      lock.acquire()
      if len(pro_list) == 0:
        print "!--No product now, wait producer put in..."
      else:
        print ":::Consumer fetch:", pro_list[0]
        pro_list.pop(0)
      lock.release()
      time.sleep(2)
Producer().start()
Producer().start()
Consumer().start()
Producer().start()
Producer().start()
Consumer().start()
Consumer().start()

这里使用多个生产者和消费者,共同操作缓冲池,部分执行结果如下:

:::Producer put: 78
!--product still in list, wait consumer to get it..
:::Consumer fetch: 78
:::Producer put: 99
!--product still in list, wait consumer to get it..
:::Consumer fetch: 99
!--No product now, wait producer put in...
:::Producer put: 12
:::Consumer fetch: 12
:::Producer put: 91
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 91
!--No product now, wait producer put in...
:::Producer put: 63
:::Consumer fetch: 63
:::Producer put: 85
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 85
!--No product now, wait producer put in...
:::Producer put: 1
:::Consumer fetch: 1
:::Producer put: 26
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 26
!--No product now, wait producer put in...
:::Producer put: 8
:::Consumer fetch: 8
:::Producer put: 19
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 19
!--No product now, wait producer put in...
:::Producer put: 74
!--product still in list, wait consumer to get it..
:::Consumer fetch: 74
:::Producer put: 50
!--product still in list, wait consumer to get it..
:::Consumer fetch: 50
!--No product now, wait producer put in...
:::Producer put: 97
:::Consumer fetch: 97
:::Producer put: 69
!--product still in list, wait consumer to get it..
!--product still in list, wait consumer to get it..
:::Consumer fetch: 69
!--No product now, wait producer put in...
:::Producer put: 41
!--product still in list, wait consumer to get it..
:::Consumer fetch: 41
:::Producer put: 6
!--product still in list, wait consumer to get it..
:::Consumer fetch: 6
!--No product now, wait producer put in...

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
Apr 15 Python
python进阶教程之模块(module)介绍
Aug 30 Python
Python实现对比不同字体中的同一字符的显示效果
Apr 23 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
python使用tornado实现登录和登出
Jul 28 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
python实现IOU计算案例
Apr 12 Python
如何提高python 中for循环的效率
Apr 15 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
python 5个顶级异步框架推荐
Sep 09 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
May 30 #Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 #Python
Python实现的本地文件搜索功能示例【测试可用】
May 30 #Python
Pycharm 创建 Django admin 用户名和密码的实例
May 30 #Python
Django使用详解:ORM 的反向查找(related_name)
May 30 #Python
Python实现决策树C4.5算法的示例
May 30 #Python
python实现决策树ID3算法的示例代码
May 30 #Python
You might like
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
国内php原创论坛
2006/10/09 PHP
PHPExcel读取Excel文件的实现代码
2011/12/06 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
Javascript学习笔记二 之 变量
2010/12/15 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
ionic实现滑动的三种方式
2016/08/27 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
vue-cli3脚手架的配置及使用教程
2018/08/28 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
用js编写留言板
2020/03/17 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
html中创建并调用vue组件的几种方法汇总
2020/11/17 Javascript
Python获取央视节目单的实现代码
2015/07/25 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
使用Python实现毫秒级抢单功能
2019/06/06 Python
美国鲜花递送:UrbanStems
2021/01/04 全球购物
师范生自荐信
2013/10/27 职场文书
婚礼证婚人证婚词
2014/01/13 职场文书
致接力运动员广播稿
2014/02/17 职场文书
承租经营合作者协议书
2014/10/01 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
基于flask实现五子棋小游戏
2021/05/25 Python
详解Laravel制作API接口
2021/05/31 PHP
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
Python加密技术之RSA加密解密的实现
2022/04/08 Python