用64行代碼實現生產者與消費者模型

只能說python太強大了


大體思路:

假設有10個數據容器。


生產者:

獲取空閒容器,沒有空閒就等待,有空閒容器就生產一個數據並填入容器。


消費者:

獲取非空容器,有非空容器就取出來消費掉,沒有就等待。



#! /usr/bin/env python
# -*- coding: utf-8 -*-
# author:曹建峯<[email protected]>

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|
+---+


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章