最近在一個Python(3.5)的小項目中需要用到多線程加快處理速度,同時需要顯示進度,於是查了些資料找到幾個實現方法:線程池的map-reduce和Queue結合線程的實現。這里簡單的實例介紹一下Queue結合線程的實現方法。
這個示例的主要功能是利用Queue和Thread模擬一個固定線程數的線程池,實現一個命令行窗口里的進度顯示,比如(1%~100%)。
1 import multiprocessing 2 from threading import Lock, Thread 3 from queue import Queue 4 import time 5 import sys 6 7 q = Queue() 8 9 # numTag和Lock用來演示多線程同步 10 numTag = 0 11 lock = Lock() 12 13 """ 14 用來演示輸出 15 """ 16 def print_num(item): 17 time.sleep(0.5) 18 # 聲明numTag是全局變量,所有的線程都可以對其進行修改 19 global numTag 20 with lock: 21 numTag += 1 22 # 輸出的時候加上'\r'可以讓光標退到當前行的開始處,進而實現顯示進度的效果 23 sys.stdout.write('\rQueue Item: {0}\tNumTag:{1}%'.format(str(item), str(numTag))) 24 25 """ 26 worker是一個中間件,把Queue接收到的值傳給對應的功能函數進行處理 27 """ 28 def worker(): 29 while True: 30 item = q.get() 31 if item is None: 32 break 33 print_num(item) 34 q.task_done() 35 36 if __name__ == '__main__': 37 # 根據CPU的數量創建對應數量的線程 38 threadCount = multiprocessing.cpu_count() 39 for i in range(threadCount): 40 t = Thread(target=worker) 41 # 設置daemon為True, 可以讓線程在主線程退出的時候一起結束 42 # 否則線程還會繼續等待 43 t.daemon = True 44 t.start() 45 46 # 通過Queue給線程傳值 47 for i in range(100): 48 q.put(i) 49 50 q.join() 51 print('')
最終輸出結果(進度會以每0.5秒增長4%的速度進行更新):
參考鏈接:https://docs.python.org/3.5/library/queue.html#Queue.Queue