写BUG的派大星

Patrick Star

  • 首页
  • 归档

  • 搜索
设计模式 Gis Kafka Druid 微信小程序 Java 开源项目源码 物体识别 机器学习 Mybatis 微服务 Feign OpenVPN CSS Streamsets CDH SpringCloud SpringBoot maven 分布式 Shell Tree Linux js WebSocket 多线程 集群 Hadoop 大数据 JDK ElasticSearch MySQL 数据库 Redis Http Nginx

Python多线程处理数据,并打印进度条

发表于 2020-10-29 | 分类于 Python | 0 | 阅读次数 1224

multiprocessing 与 threading对比

这两个库都可以实现多线程操作,而且因为多线程的思路其实差不多,所以提供的API也比较类似,但是本地实际测试中,发现multiprocessing 对多核CPU的支持更好。

Demo

import multiprocessing as mp
from tqdm import tqdm

def listener(q): 
    pbar = tqdm(total = 1000) 
    while True:
        if not q.empty():
            k=q.get()
            if k==1:
                pbar.update(1)
            else:
                break
    pbar.close()

def solve(q):
    for i in range(100):
        q.put(1)
        
if __name__ == '__main__':
    manage=mp.Manager()
    q=manage.Queue()
    p=mp.Process(target=listener,args=(q,))
    p.start()
    processList=[]
    for i in range(10):
        t=mp.Process(target=solve,args=(q,))
        processList.append(t)
        t.start()
    for i in processList:
        t.join()
    q.put(-1)
    p.join()

实现主要是通过manage.Queue来实现。
为了测试方便,这里只是做了一个简单的分片(将1000条数据分为10片,每个线程处理1片,每片100条数据)。
在每个线程处理完成一条数据后,向queue中写入一条记录。 另外一个单独的线程用来抑制获取queue里面的数据,如果有新的数据相当于进度加1。
上面代码中的t.join()用来处理每一片的数据,在这些处理完成以后,再讲打印进度条的进程join进来,以保证可以完整打印整个进度条。

  • 本文作者: Patrick
  • 本文链接: https://www.write1bug.cn/archives/python多线程处理数据并打印进度条
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 设计模式 # Gis # Kafka # Druid # 微信小程序 # Java # 开源项目源码 # 物体识别 # 机器学习 # Mybatis # 微服务 # Feign # OpenVPN # CSS # Streamsets # CDH # SpringCloud # SpringBoot # maven # 分布式 # Shell # Tree # Linux # js # WebSocket # 多线程 # 集群 # Hadoop # 大数据 # JDK # ElasticSearch # MySQL # 数据库 # Redis # Http # Nginx
Mybatis Log plugin + logback配置
ElasticSearch实现sql中的in和not in(JAVA)
  • 文章目录
  • 站点概览
Patrick

Patrick

不是在改BUG,就是在写BUG。

52 日志
9 分类
36 标签
RSS
E-mail
Creative Commons
© 2018 — 2023 Patrick
人生如逆旅|我亦是行人
鲁ICP备18043140号-1