Python多線程同步命令行模擬進度顯示


最近在一個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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM