1. 程式人生 > >python 多執行緒使用queue式例

python 多執行緒使用queue式例

參考自:https://blog.csdn.net/u011655220/article/details/79037032

from threading import Thread
import time
import random
from queue import Queue
from collections import deque
import socket

#建立佇列,設定佇列最大數限制為3個
queue = Queue()

# #生產者執行緒
class Pro_Thread(Thread):
    def run(self):
        while True:
            time.sleep(10)
            #原材料準備,等待被生產
            tasks = deque([1,2,4,3,4])
            global queue
            while True:
                try:
                    #從原材料左邊開始生產
                    task = tasks.popleft()
                    queue.put(task)
                    print("生產", task, "現在佇列數:", queue.qsize())
                    #休眠隨機時間
                    time.sleep(random.random())
                #如果原材料被生產完,生產執行緒跳出迴圈
                except IndexError:
                    print("原材料已被生產完畢")
                    break

#消費者執行緒
class Con_Thread(Thread):
    def __init__(self, i):
        super().__init__()
        self.id = i
    def run(self):
        global queue
        while True:
            try:
                #通過get(),這裡已經將佇列減去了1
                task = queue.get()
                time.sleep(1)
                #這裡可能佇列數已經空了,但是消費者手裡還有正在消費的佇列
                #發出完成的訊號,不發的話,join會永遠阻塞,程式不會停止
            except queue.Empty:
                pass

def main():

    for i in range(5):
        Con_i = Con_Thread(i)
        # 把兩個消費者執行緒列為守護執行緒,否則主執行緒結束之後不會銷燬該執行緒,程式不會停止,影響實驗結果
        #啟動執行緒
        Con_i.start()

    # 模擬tcp阻塞式樣接收資料
    td = Pro_Thread()
    td.start()
    td.join()

    print("主執行緒結束")

if __name__ == '__main__':
    main()