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