隊列-單線程
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]