您的位置:首页 > 编程语言

用64行代码实现生产者与消费者模型

2015-08-23 22:40 603 查看
只能说python太强大了

大体思路:

假设有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|
+---+
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: