詳解Python 模擬實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式的實(shí)例
散仙使用python3.4模擬實(shí)現(xiàn)的一個(gè)生產(chǎn)者與消費(fèi)者的例子,用到的知識(shí)有線程,隊(duì)列,循環(huán)等,源碼如下:
Python代碼
import queue import time import threading import random q=queue.Queue(5) #生產(chǎn)者 def pr(): name=threading.current_thread().getName() print(name+"線程啟動(dòng)......") for i in range(100): t=random.randint(2,9) print(name,"睡眠時(shí)間: ",t) time.sleep(t); d="A"+str(i) print(name+"正在存第",i+1,"個(gè)數(shù)據(jù): ",d) #q.put("A"+str(i),False,2000) q.put(d) print("生產(chǎn)完畢!") #消費(fèi)者 def co(): name=threading.current_thread().getName() time.sleep(1) print(name+"線程啟動(dòng)......") while True: print(name+"檢測到隊(duì)列數(shù)量: ",q.qsize()) t=random.randint(2,9) print(name,"睡眠時(shí)間: ",t) data=q.get(); print(name+"消費(fèi)一個(gè)數(shù)據(jù): ",data) p=threading.Thread(target=pr,name="生產(chǎn)者") c=threading.Thread(target=co,name="消費(fèi)者1") c2=threading.Thread(target=co,name="消費(fèi)者2") p.start() c.start() c2.start() 在本例里面散仙啟動(dòng)了1個(gè)生產(chǎn)者線程,2個(gè)消費(fèi)者線程,打印效果如下:
Python代碼
生產(chǎn)者線程啟動(dòng)...... 生產(chǎn)者 睡眠時(shí)間: 4 消費(fèi)者1線程啟動(dòng)...... 消費(fèi)者1檢測到隊(duì)列數(shù)量: 0 消費(fèi)者1 睡眠時(shí)間: 2 消費(fèi)者2線程啟動(dòng)...... 消費(fèi)者2檢測到隊(duì)列數(shù)量: 0 消費(fèi)者2 睡眠時(shí)間: 3 生產(chǎn)者正在存第 1 個(gè)數(shù)據(jù): A0 生產(chǎn)者 睡眠時(shí)間: 9 消費(fèi)者1消費(fèi)一個(gè)數(shù)據(jù): A0 消費(fèi)者1檢測到隊(duì)列數(shù)量: 0 消費(fèi)者1 睡眠時(shí)間: 8 生產(chǎn)者正在存第 2 個(gè)數(shù)據(jù): A1 生產(chǎn)者 睡眠時(shí)間: 5 消費(fèi)者2消費(fèi)一個(gè)數(shù)據(jù): A1 消費(fèi)者2檢測到隊(duì)列數(shù)量: 0 消費(fèi)者2 睡眠時(shí)間: 7 生產(chǎn)者正在存第 3 個(gè)數(shù)據(jù): A2 生產(chǎn)者 睡眠時(shí)間: 8 消費(fèi)者1消費(fèi)一個(gè)數(shù)據(jù): A2 消費(fèi)者1檢測到隊(duì)列數(shù)量: 0 消費(fèi)者1 睡眠時(shí)間: 2 生產(chǎn)者正在存第 4 個(gè)數(shù)據(jù): A3 生產(chǎn)者 睡眠時(shí)間: 7 消費(fèi)者2消費(fèi)一個(gè)數(shù)據(jù): A3 消費(fèi)者2檢測到隊(duì)列數(shù)量: 0 消費(fèi)者2 睡眠時(shí)間: 9 生產(chǎn)者正在存第 5 個(gè)數(shù)據(jù): A4 生產(chǎn)者 睡眠時(shí)間: 2 消費(fèi)者1消費(fèi)一個(gè)數(shù)據(jù): A4 消費(fèi)者1檢測到隊(duì)列數(shù)量: 0 消費(fèi)者1 睡眠時(shí)間: 5 生產(chǎn)者正在存第 6 個(gè)數(shù)據(jù): A5 生產(chǎn)者 睡眠時(shí)間: 5 消費(fèi)者2消費(fèi)一個(gè)數(shù)據(jù): A5 消費(fèi)者2檢測到隊(duì)列數(shù)量: 0 消費(fèi)者2 睡眠時(shí)間: 6 生產(chǎn)者正在存第 7 個(gè)數(shù)據(jù): A6 生產(chǎn)者 睡眠時(shí)間: 7 消費(fèi)者1消費(fèi)一個(gè)數(shù)據(jù): A6 消費(fèi)者1檢測到隊(duì)列數(shù)量: 0 消費(fèi)者1 睡眠時(shí)間: 7 生產(chǎn)者正在存第 8 個(gè)數(shù)據(jù): A7 生產(chǎn)者 睡眠時(shí)間: 3 消費(fèi)者2消費(fèi)一個(gè)數(shù)據(jù): A7 消費(fèi)者2檢測到隊(duì)列數(shù)量: 0 消費(fèi)者2 睡眠時(shí)間: 8 生產(chǎn)者正在存第 9 個(gè)數(shù)據(jù): A8 生產(chǎn)者 睡眠時(shí)間: 2 消費(fèi)者1消費(fèi)一個(gè)數(shù)據(jù): A8 消費(fèi)者1檢測到隊(duì)列數(shù)量: 0 消費(fèi)者1 睡眠時(shí)間: 4 生產(chǎn)者正在存第 10 個(gè)數(shù)據(jù): A9 生產(chǎn)者 睡眠時(shí)間: 4 消費(fèi)者2消費(fèi)一個(gè)數(shù)據(jù): A9 消費(fèi)者2檢測到隊(duì)列數(shù)量: 0 消費(fèi)者2 睡眠時(shí)間: 5 生產(chǎn)者正在存第 11 個(gè)數(shù)據(jù): A10 生產(chǎn)者 睡眠時(shí)間: 2 消費(fèi)者1消費(fèi)一個(gè)數(shù)據(jù): A10 消費(fèi)者1檢測到隊(duì)列數(shù)量: 0 消費(fèi)者1 睡眠時(shí)間: 3 生產(chǎn)者正在存第 12 個(gè)數(shù)據(jù): A11 生產(chǎn)者 睡眠時(shí)間: 3 消費(fèi)者2消費(fèi)一個(gè)數(shù)據(jù): A11 消費(fèi)者2檢測到隊(duì)列數(shù)量: 0 消費(fèi)者2 睡眠時(shí)間: 3 生產(chǎn)者正在存第 13 個(gè)數(shù)據(jù): A12 生產(chǎn)者 睡眠時(shí)間: 3 消費(fèi)者1消費(fèi)一個(gè)數(shù)據(jù): A12 消費(fèi)者1檢測到隊(duì)列數(shù)量: 0 消費(fèi)者1 睡眠時(shí)間: 3 生產(chǎn)者正在存第 14 個(gè)數(shù)據(jù): A13 生產(chǎn)者 睡眠時(shí)間: 8 消費(fèi)者2消費(fèi)一個(gè)數(shù)據(jù): A13 消費(fèi)者2檢測到隊(duì)列數(shù)量: 0 消費(fèi)者2 睡眠時(shí)間: 7 生產(chǎn)者正在存第 15 個(gè)數(shù)據(jù): A14 生產(chǎn)者 睡眠時(shí)間: 3 消費(fèi)者1消費(fèi)一個(gè)數(shù)據(jù): A14 消費(fèi)者1檢測到隊(duì)列數(shù)量: 0 消費(fèi)者1 睡眠時(shí)間: 7 生產(chǎn)者正在存第 16 個(gè)數(shù)據(jù): A15 生產(chǎn)者 睡眠時(shí)間: 2 消費(fèi)者2消費(fèi)一個(gè)數(shù)據(jù): A15 消費(fèi)者2檢測到隊(duì)列數(shù)量: 0 消費(fèi)者2 睡眠時(shí)間: 9
新聞熱點(diǎn)
疑難解答
圖片精選