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实现微信跳一跳辅助工具步骤详解
Jan 04 Python
python脚本监控Tomcat服务器的方法
Jul 06 Python
Python爬取视频(其实是一篇福利)过程解析
Aug 01 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
Python实现快速排序的方法详解
Oct 25 Python
Python全局锁中如何合理运用多线程(多进程)
Nov 06 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
Keras 快速解决OOM超内存的问题
Jun 11 Python
python pymysql库的常用操作
Oct 16 Python
Python关于OS文件目录处理的实例分享
May 23 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调用Oracle存储过程
2006/10/09 PHP
《PHP边学边教》(01.开篇――准备工作)
2006/12/13 PHP
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
php判断访问IP的方法
2015/06/19 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
js返回上一页并刷新代码整理
2012/12/21 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
2016/09/23 Javascript
NodeJs生成sitemap站点地图的方法示例
2019/06/11 NodeJs
vue组件系列之TagsInput详解
2020/05/14 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
[01:06]欢迎来到上海,TI9
2018/08/26 DOTA
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
django 多数据库及分库实现方式
2020/04/01 Python
python脚本监控logstash进程并邮件告警实例
2020/04/28 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
css3 矩阵的使用详解
2018/03/20 HTML / CSS
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
生物化工工艺专业应届生求职信
2013/10/08 职场文书
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
励志演讲稿500字
2014/08/21 职场文书
处级领导班子全部召开专题民主生活会情况汇报
2014/09/27 职场文书
缓刑期间思想汇报范文
2014/10/10 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
聘用合同范本
2015/09/21 职场文书
大学班长竞选稿
2015/11/20 职场文书
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL