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开发环境搭建
Dec 16 Python
浅谈Python 的枚举 Enum
Jun 12 Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
Apr 21 Python
python环境路径配置以及命令行运行脚本
Apr 02 Python
Python 实现数据结构-循环队列的操作方法
Jul 17 Python
如何在python中写hive脚本
Nov 08 Python
TensorFlow查看输入节点和输出节点名称方式
Jan 04 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 Python
python上传时包含boundary时的解决方法
Apr 08 Python
PyTorch-GPU加速实例
Jun 23 Python
Pillow图像处理库安装及使用
Apr 12 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表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
PHP-Fcgi下PHP的执行时间设置方法
2013/08/02 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
php上传大文件设置方法
2016/04/14 PHP
PHP 传输会话curl函数的实例详解
2017/09/12 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
dojo随手记 gird组件引用
2011/02/24 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
js 一个关于图片onload加载的事
2013/11/10 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
微信小程序 wx.request方法的异步封装实例详解
2017/05/18 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
JS实现图片懒加载(lazyload)过程详解
2020/04/02 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
[03:36]DOTA2完美大师赛coL战队趣味视频——我演你猜
2017/11/23 DOTA
Python编程中的文件操作攻略
2015/10/16 Python
Tensorflow简单验证码识别应用
2017/05/25 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
如何在django中实现分页功能
2020/04/22 Python
python利用opencv保存、播放视频
2020/11/02 Python
python基于openpyxl生成excel文件
2020/12/23 Python
css3实现一个div设置多张背景图片及background-image属性实例演示
2017/08/10 HTML / CSS
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
学生会竞选自荐信
2013/10/12 职场文书
火灾现场处置方案
2014/05/28 职场文书
优秀会计求职信
2014/07/04 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
高中政治教师教学反思
2016/02/23 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android