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

posted @ 2015-11-22 21:57  silverbullet11  阅读(4541)  评论(0编辑  收藏  举报