python 多線程與隊列

隊列-單線程

import threading
import queue#不是線程模塊的隊列
import time


class worker(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.thread_stop = False

    def run(self):
        while not self.thread_stop:
            print(f"{self.name} id:{self.ident} 等待測試")
            try:
                task = q.get(block=True, timeout=2)  # 接收消息
            except queue.Empty:
                print("工作結束! 我可以回家了!")
                self.thread_stop = True
                break
            print(f"\t工作任務:{task[0]} 任務編號:{task[1]}")
            print("\t工作中...")
            time.sleep(1.2)
            print("\t工作結束!")
            q.task_done()                           # 完成一個任務
            res = q.qsize()                         # 判斷消息隊列大小(隊列中還有幾個任務)
            if res > 0:
                print(f"\t還有{res}個任務要做,加油!")

    def stop(self):
        self.thread_stop = True


if __name__ == "__main__":
    q = queue.Queue(3)                                    # 創建隊列(大小爲3)
    worker = worker(q)                                    # 將隊列加入類中
    print("***********************領導:開始工作!")
    worker.start()                                        # 啓動類
    q.put(["produce cup!", 1], block=True, timeout=None)  # 向隊列中添加元素,產生任務消息
    q.put(["produce desk!", 2], block=True, timeout=None)
    q.put(["produce apple!", 3], block=True, timeout=None)
    q.put(["produce banana!", 4], block=True, timeout=None)
    q.put(["produce bag!", 5], block=True, timeout=None)
    q.join()                                             # 等待所有任務完成
    print("***********************領導:所有任務完成!")






輸出:

***********************領導:開始工作!
Thread-1 id:10344 等待測試
	工作任務:produce cup! 任務編號:1
	工作中...
	工作結束!
	還有3個任務要做,加油!
Thread-1 id:10344 等待測試
	工作任務:produce desk! 任務編號:2
	工作中...
	工作結束!
	還有3個任務要做,加油!
Thread-1 id:10344 等待測試
	工作任務:produce apple! 任務編號:3
	工作中...
	工作結束!
	還有2個任務要做,加油!
Thread-1 id:10344 等待測試
	工作任務:produce banana! 任務編號:4
	工作中...
	工作結束!
	還有1個任務要做,加油!
Thread-1 id:10344 等待測試
	工作任務:produce bag! 任務編號:5
	工作中...
	工作結束!
Thread-1 id:10344 等待測試
***********************領導:所有任務完成!
工作結束! 我可以回家了!
[Finished in 8.1s]

隊列-多線程

import threading
import time
import logging
from queue import Queue
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [*] %(message)s"
)
img_lists = ['lipei_00006.mp3', 'lipei_00007.mp3', 'lipei_00012.mp3', 'lipei_00014.mp3',
             'lipei_00021.mp3', 'lipei_00027.mp3', 'lipei_00028.mp3', 'lipei_00035.mp3',
             'lipei_00039.mp3', 'lipei_00044.mp3', 'lipei_00047.mp3', 'lipei_00049.mp3',
             'lipei_00057.mp3', 'lipei_00058.mp3', 'lipei_00059.mp3', 'lipei_00061.mp3',
             'lipei_00066.mp3', 'lipei_00068.mp3', 'lipei_00070.mp3', 'lipei_00081.mp3',
             'lipei_00087.mp3', 'lipei_00104.mp3', 'lipei_00106.mp3', 'lipei_00117.mp3',
             'lipei_00123.mp3', 'lipei_00129.mp3', ]


class Music_Cols(threading.Thread):
    def __init__(self, name, queue):
        super().__init__(name=name)
        self.queue = queue

    def run(self):
        global img_lists
        while True:
            try:
                music = img_lists.pop(0)
                self.queue.put(music)
            except IndexError:
                break


class Music_Play(threading.Thread):
    def __init__(self, name, queue):
        super().__init__(name=name)
        self.queue = queue

    def run(self):
        while True:
            if self.queue.not_empty:
                music = q.get()
                logging.info(f"{threading.current_thread()}正在播放{music}")
                time.sleep(2)
                q.task_done()
                logging.info(f'{music}播放結束')
            else:
                break


if __name__ == '__main__':
    q = Queue(10)
    mc_thread = Music_Cols('music_cols', q)
    mc_thread.setDaemon(True)       # 設置爲守護進程,主線程退出時,子進程也kill掉
    mc_thread.start()               # 啓動進程
    for _ in range(5):              # 設置線程個數(批量任務時,線程數不必太大,注意內存及CPU負載)
        mp_thread = Music_Play('music_play', q)
        mp_thread.setDaemon(True)
        mp_thread.start()
    q.join()                        # 線程阻塞(等待所有子線程處理完成,再退出)

輸出:

2019-12-08 16:10:58,391 [*] <Music_Play(music_play, started daemon 12460)>正在播放lipei_00006.mp3
2019-12-08 16:10:58,407 [*] <Music_Play(music_play, started daemon 9084)>正在播放lipei_00007.mp3
2019-12-08 16:10:58,409 [*] <Music_Play(music_play, started daemon 11296)>正在播放lipei_00012.mp3
2019-12-08 16:10:58,410 [*] <Music_Play(music_play, started daemon 12048)>正在播放lipei_00014.mp3
2019-12-08 16:10:58,410 [*] <Music_Play(music_play, started daemon 8208)>正在播放lipei_00021.mp3
2019-12-08 16:11:00,411 [*] lipei_00021.mp3播放結束
2019-12-08 16:11:00,411 [*] lipei_00014.mp3播放結束
2019-12-08 16:11:00,411 [*] lipei_00012.mp3播放結束
2019-12-08 16:11:00,412 [*] <Music_Play(music_play, started daemon 11296)>正在播放lipei_00035.mp3
2019-12-08 16:11:00,411 [*] lipei_00006.mp3播放結束
2019-12-08 16:11:00,412 [*] <Music_Play(music_play, started daemon 12460)>正在播放lipei_00039.mp3
2019-12-08 16:11:00,411 [*] <Music_Play(music_play, started daemon 8208)>正在播放lipei_00027.mp3
2019-12-08 16:11:00,411 [*] lipei_00007.mp3播放結束
2019-12-08 16:11:00,412 [*] <Music_Play(music_play, started daemon 9084)>正在播放lipei_00044.mp3
2019-12-08 16:11:00,411 [*] <Music_Play(music_play, started daemon 12048)>正在播放lipei_00028.mp3
2019-12-08 16:11:02,415 [*] lipei_00028.mp3播放結束
2019-12-08 16:11:02,415 [*] lipei_00044.mp3播放結束
2019-12-08 16:11:02,415 [*] lipei_00027.mp3播放結束
2019-12-08 16:11:02,415 [*] lipei_00039.mp3播放結束
2019-12-08 16:11:02,415 [*] lipei_00035.mp3播放結束
2019-12-08 16:11:02,415 [*] <Music_Play(music_play, started daemon 12048)>正在播放lipei_00047.mp3
2019-12-08 16:11:02,415 [*] <Music_Play(music_play, started daemon 9084)>正在播放lipei_00049.mp3
2019-12-08 16:11:02,416 [*] <Music_Play(music_play, started daemon 8208)>正在播放lipei_00057.mp3
2019-12-08 16:11:02,416 [*] <Music_Play(music_play, started daemon 12460)>正在播放lipei_00058.mp3
2019-12-08 16:11:02,416 [*] <Music_Play(music_play, started daemon 11296)>正在播放lipei_00059.mp3
2019-12-08 16:11:04,418 [*] lipei_00059.mp3播放結束
2019-12-08 16:11:04,418 [*] lipei_00058.mp3播放結束
2019-12-08 16:11:04,418 [*] lipei_00057.mp3播放結束
2019-12-08 16:11:04,419 [*] lipei_00049.mp3播放結束
2019-12-08 16:11:04,419 [*] lipei_00047.mp3播放結束
2019-12-08 16:11:04,419 [*] <Music_Play(music_play, started daemon 11296)>正在播放lipei_00061.mp3
2019-12-08 16:11:04,419 [*] <Music_Play(music_play, started daemon 12460)>正在播放lipei_00066.mp3
2019-12-08 16:11:04,419 [*] <Music_Play(music_play, started daemon 8208)>正在播放lipei_00068.mp3
2019-12-08 16:11:04,420 [*] <Music_Play(music_play, started daemon 9084)>正在播放lipei_00070.mp3
2019-12-08 16:11:04,420 [*] <Music_Play(music_play, started daemon 12048)>正在播放lipei_00081.mp3
2019-12-08 16:11:06,423 [*] lipei_00068.mp3播放結束
2019-12-08 16:11:06,423 [*] <Music_Play(music_play, started daemon 8208)>正在播放lipei_00087.mp3
2019-12-08 16:11:06,423 [*] lipei_00081.mp3播放結束
2019-12-08 16:11:06,423 [*] lipei_00066.mp3播放結束
2019-12-08 16:11:06,423 [*] lipei_00061.mp3播放結束
2019-12-08 16:11:06,423 [*] lipei_00070.mp3播放結束
2019-12-08 16:11:06,423 [*] <Music_Play(music_play, started daemon 12048)>正在播放lipei_00104.mp3
2019-12-08 16:11:06,423 [*] <Music_Play(music_play, started daemon 12460)>正在播放lipei_00106.mp3
2019-12-08 16:11:06,423 [*] <Music_Play(music_play, started daemon 11296)>正在播放lipei_00117.mp3
2019-12-08 16:11:06,423 [*] <Music_Play(music_play, started daemon 9084)>正在播放lipei_00123.mp3
2019-12-08 16:11:08,426 [*] lipei_00117.mp3播放結束
2019-12-08 16:11:08,426 [*] <Music_Play(music_play, started daemon 11296)>正在播放lipei_00129.mp3
2019-12-08 16:11:08,426 [*] lipei_00123.mp3播放結束
2019-12-08 16:11:08,426 [*] lipei_00106.mp3播放結束
2019-12-08 16:11:08,426 [*] lipei_00104.mp3播放結束
2019-12-08 16:11:08,426 [*] lipei_00087.mp3播放結束
2019-12-08 16:11:10,428 [*] lipei_00129.mp3播放結束
[Finished in 12.2s]
發佈了47 篇原創文章 · 獲贊 3 · 訪問量 7810
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章