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将字符串转换成数组的方法
Apr 29 Python
Python中for循环和while循环的基本使用方法
Aug 21 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
Python调用C# Com dll组件实战教程
Oct 12 Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 Python
Python实现的基于优先等级分配糖果问题算法示例
Apr 25 Python
Python使用dict.fromkeys()快速生成一个字典示例
Apr 24 Python
Python基于scipy实现信号滤波功能
May 08 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
浅析Python中字符串的intern机制
Oct 03 Python
python实现图片转字符画
Feb 19 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
php木马webshell扫描器代码
2012/01/25 PHP
PHP小教程之实现链表
2014/06/09 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
PHP的mysqli_thread_id()函数讲解
2019/01/24 PHP
laravel 实现根据字段不同值做不同查询
2019/10/23 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
2010/05/13 Javascript
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
JavaScript中子对象访问父对象的方式详解
2016/09/01 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
简单的Python2.7编程初学经验总结
2015/04/01 Python
python学生信息管理系统(完整版)
2020/04/05 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
scrapy-redis的安装部署步骤讲解
2019/02/27 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
Python发送邮件封装实现过程详解
2020/05/09 Python
Python中格式化字符串的四种实现
2020/05/26 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
外语专业毕业生个人的自荐信
2013/11/19 职场文书
企事业单位求职者的自我评价
2013/12/28 职场文书
捐款倡议书
2014/04/14 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
优秀班主任工作总结2015
2015/05/25 职场文书
二审代理词范文
2015/05/25 职场文书
Echarts如何重新渲染实例详解
2022/05/30 Javascript
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技