用64行代码实现生产者与消费者模型
2015-08-23 22:40
603 查看
只能说python太强大了
大体思路:
假设有10个数据容器。
生产者:
获取空闲容器,没有空闲就等待,有空闲容器就生产一个数据并填入容器。
消费者:
获取非空容器,有非空容器就取出来消费掉,没有就等待。
![](http://img.blog.csdn.net/20150823223525647?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
输出结果:
大体思路:
假设有10个数据容器。
生产者:
获取空闲容器,没有空闲就等待,有空闲容器就生产一个数据并填入容器。
消费者:
获取非空容器,有非空容器就取出来消费掉,没有就等待。
#! /usr/bin/env python # -*- coding: utf-8 -*- # author:曹建峰<windcao@hotmail.com> import random import threading import time BUF_LEN = 10 datas = [] empty_semaphore = threading._Semaphore(BUF_LEN) full_semaphore = threading._Semaphore(0) work_lock = threading.Lock() def producer(): while True: if empty_semaphore.acquire(): work_lock.acquire() data = int(random.random()*100) datas.append(data) time.sleep(1) print "P:%d ; datalen = %d" % (data,len(datas)) printDatas() work_lock.release() full_semaphore.release() def cunsumer(): while True: if full_semaphore.acquire(): work_lock.acquire() data = datas.pop(0) time.sleep(1) print "C:%d ; datalen = %d" % (data,len(datas)) printDatas() work_lock.release() empty_semaphore.release() def printDatas(): for data in datas: print "+---+" print "|%3d|" % data print "+---+" if __name__ == "__main__": p = threading.Thread(target=producer) c = threading.Thread(target=cunsumer) threads = [p,c] for trd in threads: trd.setDaemon(True) trd.start() alive = False while 1: time.sleep(1) for trd in threads: if trd.isAlive(): alive = True break if not alive: break
输出结果:
$ python pctest.py P:76 ; datalen = 1 +---+ | 76| +---+ P:80 ; datalen = 2 +---+ | 76| +---+ | 80| +---+ C:76 ; datalen = 1 +---+ | 80| +---+ C:80 ; datalen = 0 +---+ P:37 ; datalen = 1 +---+ | 37| +---+ P:46 ; datalen = 2 +---+ | 37| +---+ | 46| +---+ C:37 ; datalen = 1 +---+ | 46| +---+ C:46 ; datalen = 0 +---+ P:8 ; datalen = 1 +---+ | 8| +---+ P:27 ; datalen = 2 +---+ | 8| +---+ | 27| +---+ P:61 ; datalen = 3 +---+ | 8| +---+ | 27| +---+ | 61| +---+ C:8 ; datalen = 2 +---+ | 27| +---+ | 61| +---+ P:79 ; datalen = 3 +---+ | 27| +---+ | 61| +---+ | 79| +---+ C:27 ; datalen = 2 +---+ | 61| +---+ | 79| +---+ P:1 ; datalen = 3 +---+ | 61| +---+ | 79| +---+ | 1| +---+ C:61 ; datalen = 2 +---+ | 79| +---+ | 1| +---+ C:79 ; datalen = 1 +---+ | 1| +---+ P:94 ; datalen = 2 +---+ | 1| +---+ | 94| +---+ P:61 ; datalen = 3 +---+ | 1| +---+ | 94| +---+ | 61| +---+ P:66 ; datalen = 4 +---+ | 1| +---+ | 94| +---+ | 61| +---+ | 66| +---+ C:1 ; datalen = 3 +---+ | 94| +---+ | 61| +---+ | 66| +---+ P:61 ; datalen = 4 +---+ | 94| +---+ | 61| +---+ | 66| +---+ | 61| +---+ P:37 ; datalen = 5 +---+ | 94| +---+ | 61| +---+ | 66| +---+ | 61| +---+ | 37| +---+ P:92 ; datalen = 6 +---+ | 94| +---+ | 61| +---+ | 66| +---+ | 61| +---+ | 37| +---+ | 92| +---+ C:94 ; datalen = 5 +---+ | 61| +---+ | 66| +---+ | 61| +---+ | 37| +---+ | 92| +---+ C:61 ; datalen = 4 +---+ | 66| +---+ | 61| +---+ | 37| +---+ | 92| +---+
相关文章推荐
- C++中的函数指针和函数对象
- 如何在Mac上配置/使用Github
- 零基础学python-7.7 字符串格式化方法(1)
- 零基础学python-7.7 字符串格式化方法(1)
- for(i=0,j=0;i<10,j<10;i++,j++)用python怎么写
- c# Socket 开发小记
- Python编写Hadoop MapReduce程序
- POJ 2195 Going Home(二分图最大权值匹配) KM
- OpenCV249 for python278 最简配置方案
- C++实现线程池类
- 翻转子串(Java)
- python的深拷贝和浅拷贝
- python中threading的高级函数应用解析 Lock Rlock Condition Semaphore Timer Event Semaphore对象
- 第一次完成一个编程算术题
- Java多线程编程-同步方法
- (2.1.23)java的枚举enum
- Java运算符优先级表
- Struts2学习笔记(一):struts2开发环境配置
- Spring Named Parameters examples in SimpleJdbcTemplate
- Java(TM) platform SE binary占用几乎全部CPU