• 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         # 输出的时候加上'
    '可以让光标退到当前行的开始处,进而实现显示进度的效果
    23         sys.stdout.write('
    Queue Item: {0}	NumTag:{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

  • 相关阅读:
    基于 .NET Core 的简单文件服务器
    重启博客园,走出第一步
    layui扩展组件zTreeSelectM,下拉树多选
    skyline加载arcgis发布的wms服务
    HTML&CSS:构建网站不能不说的那些事儿
    VueCLi3 配置less变量
    Bootstrap4 本地编译运行
    冒泡排序和选择排序
    Router
    ToDoList
  • 原文地址:https://www.cnblogs.com/silverbullet11/p/Python-Queue-multithread.html
Copyright © 2020-2023  润新知