iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中如何将Tqdm与Asyncio结合使用呢
  • 270
分享到

Python中如何将Tqdm与Asyncio结合使用呢

Python 官方文档:入门教程 => 点击学习

摘要

目录简介困扰已有方法tqdm异步tqdm 概述将 tqdm 与异步集成简介 困扰 在 python 中使用并发编程来提高效率对于数据科学家来说并不罕见。在后台观察各种子进程或并发线程

简介

困扰

python 中使用并发编程来提高效率对于数据科学家来说并不罕见。在后台观察各种子进程或并发线程以保持我的计算或 io 绑定任务的顺序总是令人满意的。

但是还有一点困扰我的是,当我在后台并发处理成百上千个文件或者执行成百上千个进程时,我总是担心会不会有几个任务偷偷挂了,整个代码永远跑不完。我也很难知道代码现在在哪里执行。

最糟糕的是,当我看着一个空白屏幕时,很难说出我的代码需要多长时间才能执行或 ETA 是多少。这对我安排工作日程的能力非常不利。

因此,我想要一种方法让我知道代码执行到了哪里。

已有方法

比较传统的做法是任务之间共享一块内存区域,在这块内存区域放一个计数器,当一个任务结束的时候让这个计数器+1,然后用一个线程不停的打印这个计数器的值。

这从来都不是一个好的解决方案:一方面,我需要在你现有的业务逻辑中添加一段用于计数的代码,这违反了“低耦合,高内聚”的原则。另一方面,由于线程安全问题,我必须非常小心定机制,这会导致不必要的性能问题。

tqdm

有一天,我发现了 tqdm 库,它使用进度条来可视化我的代码进度。我可以使用进度条来可视化我的 asyncio 任务的完成和预计到达时间吗?

那么本文我把这个方法分享给大家,让每个程序员都有机会监控自己并发任务的进度。

异步

在我们开始之前,我希望您了解一些 Python asyncio 的背景知识。我的文章描述了asyncio的一些常用api的用法,这将有助于我们更好地理解tqdm的设计:

tqdm 概述

如官方网站所述,tqdm 是一个显示循环进度条的工具。它使用简单、高度可定制并且占用资源少。

一个典型的用法是将一个可迭代对象传递给 tqdm 构造函数,然后你会得到一个如下所示的进度条:

from time import sleep
from tqdm import tqdm


def main():
    for _ in tqdm(range(100)):
        # do something in the loop
        sleep(0.1)


if __name__ == "__main__":
    main()

或者您可以在读取文件时手动浏览并更新进度条的进度:

import os
from tqdm import tqdm


def main():
    filename = "../data/large-dataset"
    with (tqdm(total=os.path.getsize(filename)) as bar,
            open(filename, "r", encoding="utf-8") as f):
        for line in f:
            bar.update(len(line))


if __name__ == "__main__":
    main()

将 tqdm 与异步集成

总体而言,tqdm 非常易于使用。但是,GitHub 上需要更多关于将 tqdm 与 asyncio 集成的信息。所以我深入研究了源代码,看看 tqdm 是否支持 asyncio。

幸运的是,最新版本的 tqdm 提供了包 tqdm.asyncio,它提供了类 tqdm_asyncio。

tqdm_asyncio 类有两个相关的方法。一个是 tqdm_asyncio.as_completed。从源码可以看出,它是对asyncio.as_completed的包装:

@claSSMethod
    def as_completed(cls, fs, *, loop=None, timeout=None, total=None, **tqdm_kwargs):
        """
        Wrapper for `asyncio.as_completed`.
        """
        if total is None:
            total = len(fs)
        kwargs = {}
        if version_info[:2] < (3, 10):
            kwargs['loop'] = loop
        yield from cls(asyncio.as_completed(fs, timeout=timeout, **kwargs),
                       total=total, **tqdm_kwargs)

另一个是 tqdm_asyncio.gather ,从源代码可以看出,它基于模拟 asyncio.gather 功能的 tqdm_asyncio.as_completed 的实现:

@classmethod
    async def gather(cls, *fs, loop=None, timeout=None, total=None, **tqdm_kwargs):
        """
        Wrapper for `asyncio.gather`.
        """
        async def wrap_awaitable(i, f):
            return i, await f

        ifs = [wrap_awaitable(i, f) for i, f in enumerate(fs)]
        res = [await f for f in cls.as_completed(ifs, loop=loop, timeout=timeout,
                                                 total=total, **tqdm_kwargs)]
        return [i for _, i in sorted(res)]

所以,接下来,我将描述这两个API的用法。在开始之前,我们还需要做一些准备工作。在这里,我写了一个简单的方法来模拟一个随机休眠时间的并发任务:

import asyncio
import random

from tqdm.asyncio import tqdm_asyncio


class AsyncException(Exception):
    def __int__(self, message):
        super.__init__(self, message)


async def some_coro(simu_exception=False):
    delay = round(random.unifORM(1.0, 5.0), 2)

    # We will simulate throwing an exception if simu_exception is True
    if delay > 4 and simu_exception:
        raise AsyncException("something wrong!")

    await asyncio.sleep(delay)

    return delay

紧接着,我们将创建 2000 个并发任务,然后使用 tqdm_asyncio.gather 而不是熟悉的 asyncio.gather 方法来查看进度条是否正常工作:

async def main():
    tasks = []
    for _ in range(2000):
        tasks.append(some_coro())
    await tqdm_asyncio.gather(*tasks)

    print(f"All tasks done.")


if __name__ == "__main__":
    asyncio.run(main())

或者让我们用 tqdm_asyncio.as_completed 替换 tqdm_asyncio.gather 并重试:

async def main():
    tasks = []
    for _ in range(2000):
        tasks.append(some_coro())

    for done in tqdm_asyncio.as_completed(tasks):
        await done

    print(f"The tqdm_asyncio.as_completed also works fine.")


if __name__ == "__main__":
    asyncio.run(main())

到此这篇关于Python中如何将Tqdm与Asyncio结合使用呢的文章就介绍到这了,更多相关Python Tqdm Asyncio内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python中如何将Tqdm与Asyncio结合使用呢

本文链接: http://www.lsjlt.com/news/202102.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中如何将Tqdm与Asyncio结合使用呢
    目录简介困扰已有方法tqdm异步tqdm 概述将 tqdm 与异步集成简介 困扰 在 Python 中使用并发编程来提高效率对于数据科学家来说并不罕见。在后台观察各种子进程或并发线程...
    99+
    2023-05-12
    Python结合使用Tqdm Asyncio Python Tqdm Asyncio Python Tqdm Python Asyncio
  • 如何将 Go 与 MySQL 结合使用?
    MySQL是一种流行的开源关系型数据库管理系统,在现代Web应用程序中被广泛使用。另一方面,Go是一种快速高效的编程语言,越来越受欢迎用于构建Web应用程序。在本文中,我们将讨论如何使用Go与MySQL,包括如何连接到MySQL数据库以及如...
    99+
    2023-10-22
  • 如何将 Go 与 MongoDB 结合使用?
    MongoDB 是一种流行的 NoSQL 数据库,广泛应用于现代 Web 应用程序中。另一方面,Go 是一种快速高效的编程语言,在构建 Web 应用程序方面越来越受欢迎。在本文中,我们将讨论如何将 Go 与 MongoDB 结合使用,包括如...
    99+
    2023-10-22
  • 将 bytes.Buffer 与 csv.writer 结合使用
    从现在开始,我们要努力学习啦!今天我给大家带来《将 bytes.Buffer 与 csv.writer 结合使用》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文...
    99+
    2024-04-05
  • 将 MySQL 与 Apache 结合使用
    MySQL 和 Apache 是两个独立的软件,可以在同一台服务器上安装和运行。下面是将 MySQL 和 Apache 结合使用的一...
    99+
    2023-10-20
    MySQL
  • Spring 和 Numpy:如何在 Python 中将它们结合使用?
    Python 作为一种高级编程语言,拥有许多流行的库和框架。其中,Spring 和 Numpy 是两个非常受欢迎的库,它们分别用于构建 Java Web 应用程序和进行科学计算。在本文中,我们将介绍如何在 Python 中将 Spring...
    99+
    2023-08-31
    教程 spring numpy
  • 机器学习实践中如何将Spark与Python结合
    本篇文章给大家分享的是有关机器学习实践中如何将Spark与Python结合,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Apache Spark是处理和使用大数据最广泛的框架之...
    99+
    2023-06-02
  • ASP 框架与 numpy:如何将它们结合使用?
    ASP(Active Server Pages)是一种基于服务器端的动态网页开发技术,而numpy则是一个Python中用于科学计算的强大库。两者结合起来可以为开发人员带来更加便捷的开发体验。本文将介绍如何将ASP框架与numpy结合使用...
    99+
    2023-06-27
    框架 对象 numpy
  • Linux中的PHP重定向:如何将它与Windows结合使用?
    PHP是一种流行的开源编程语言,广泛应用于Web开发和服务器端编程。在Linux中,重定向是一个非常有用的特性,它可以将输出从一个命令或脚本重定向到另一个地方,如文件或另一个进程。在本文中,我们将探讨如何在Linux中使用PHP进行重定向...
    99+
    2023-08-23
    linux 重定向 windows
  • 如何将Golang和Kafka结合使用
    Kafka是一个开源的分布式消息队列,在大数据应用中常常被用于构建实时数据流处理应用。而Golang则是Google开发的一种编程语言,以其高效的并发性、强大的库和生态系统而闻名。那么,如何使用Golang与Kafka进行结合呢?首先,我们...
    99+
    2023-05-14
  • python如何将Lambda与map功能配合使用
    小编给大家分享一下python如何将Lambda与map功能配合使用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!将Lambda与map功能配合使用该函数可以用python中的lambda函数替换。 创建以下程序以创建数字...
    99+
    2023-06-27
  • 如何使用tqdm在Python应用中显示进度
    本篇内容主要讲解“如何使用tqdm在Python应用中显示进度”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用tqdm在Python应用中显示进度”吧!阿拉米语,希伯来语和阿拉伯语中的闪米...
    99+
    2023-06-15
  • Apache存储和Python API:如何将它们结合使用?
    在现代数据处理中,Apache存储是一种非常常见的数据存储方式。这是因为Apache存储提供了一种可扩展的、分布式的、高性能的数据存储方式。同时,Python也是一种非常流行的编程语言,拥有广泛的应用领域。Python API为我们提供了...
    99+
    2023-07-18
    api apache 存储
  • Python中Playwright 与 pyunit 结合使用详解
    今天来填坑, 昨天说playwright未必一定要使用pytest-playwright包。 它也可以和pyunit一起使用。 那么今天,田辛老师就给大家一个例子, 供大家参考。当然...
    99+
    2023-03-03
    Playwright 与 pyunit 使用 Playwright使用
  • Python asyncio常用函数如何使用
    这篇文章主要介绍“Python asyncio常用函数如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python asyncio常用函数如何使用”文章能帮助大家解决问题。...
    99+
    2023-07-05
  • Python中Playwright与pyunit怎么结合使用
    这篇文章主要介绍“Python中Playwright与pyunit怎么结合使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中Playwright与pyunit怎么结合使用”文章能帮助大...
    99+
    2023-07-05
  • python如何使用tqdm制作进度条
    这篇文章主要介绍了python如何使用tqdm制作进度条,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用tqdm制作进度条TQDM库使你可以为Python和CLI创建快速地...
    99+
    2023-06-27
  • PHP 和 NumPy:如何将它们结合使用?
    PHP 是一种流行的服务器端脚本语言,而 NumPy 是一个强大的 Python 库,用于科学计算和数据分析。虽然它们在语言和用途上有很大的区别,但将它们结合使用可以为数据处理和分析提供更多的可能性。在本文中,我们将探讨如何在 PHP 中...
    99+
    2023-07-07
    对象 numpy numy
  • NumPy和Spring:如何将它们结合使用?
    NumPy是一种用于科学计算的Python扩展库,而Spring则是Java应用程序开发的开源框架。这两个工具都拥有各自的优势和功能,将它们结合使用可以实现更加高效和强大的数据处理和应用程序开发。 在本文中,我们将介绍如何将NumPy和Sp...
    99+
    2023-09-26
    api numpy spring
  • Python与Spring的完美结合:如何使用数组?
    在软件开发中,数组是一种非常常见的数据结构,它可以用来存储一组相同类型的数据。Python和Spring分别是两种非常流行的编程语言和框架,那么如何在这两者之间实现完美的结合,以便更好地使用数组呢?本文将为您介绍Python和Spring...
    99+
    2023-06-20
    spring 数组 教程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作