python异步编程 使用yield from过程解析

yizhihongxing

Python异步编程是一种非常流行的编程技巧,可以极大地提高程序的性能和响应速度。使用yield from是Python中异步编程的一种常见实现方式,本文将对其详细进行讲解。

什么是异步编程?

在介绍yield from之前,我们有必要先了解什么是异步编程。

在传统的同步编程中,程序按照顺序逐条执行,每一行代码都需要等待前一行代码执行完成后才能开始执行,这样就会遇到一些阻塞操作(比如网络请求、文件IO等),导致程序等待时间变长,资源利用率低下。而异步编程则是利用事件循环机制和非阻塞IO技术,让程序在等待IO操作时能够执行其他任务,从而提高效率。

yield from的用法

yield from是Python 3.3引入的一种语法,用于简化生成器的委托生成器机制。它的主要作用是在生成器中嵌套其他生成器,从而在子生成器和调用方之间建立一个双向通道,使得两者可以直接互相通信。

下面是yield from的一般用法:

def sub_generator():
    yield 1

def gen_fn():
    yield from sub_generator()

在上面的代码中,sub_generator()是一个子生成器,而gen_fn()就是一个委托生成器。当gen_fn()中调用yield from sub_generator()时,它会暂停执行并让出控制权,等待子生成器返回,接着它会把子生成器返回的值传递给调用者。

下面我们来看一下yield from在异步编程中的具体用法。

异步编程示例一

假设我们需要爬取多个网页的内容,并且每个网页的获取时间都不确定,那么我们可以使用异步编程来实现:

import asyncio
import aiohttp

async def get_html(url):  # 单个网页的获取函数
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            html = await response.text()
            return html

async def main(urls):  # 多个网页并发获取函数
    tasks = [asyncio.create_task(get_html(url)) for url in urls]
    for task in asyncio.as_completed(tasks):
        html = await task
        print(html)

urls = ['https://www.baidu.com', 'https://www.google.com', 'https://cn.bing.com']
asyncio.run(main(urls))

在上面的代码中,我们使用了async withawait关键字来异步处理网络请求。在main函数中,我们使用了asyncio.create_task来创建异步任务,然后通过asyncio.as_completed函数获取异步任务完成的顺序,最后使用await关键字等待任务完成并获取结果。

异步编程示例二

假设我们需要在GUI程序中更新进度条,并且更新进度条的时候不能阻塞主线程,那么我们可以使用异步编程来实现:

import asyncio
import time
import tkinter as tk

async def update_progress_bar(progress_var):
    for i in range(11):
        progress_var.set(i * 10)
        await asyncio.sleep(0.5)  # 防止阻塞主线程
    progress_var.set(0)

if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('300x50')
    root.resizable(False, False)

    progress_var = tk.DoubleVar()
    progress_bar = tk.Progressbar(root, variable=progress_var, orient=tk.HORIZONTAL)
    progress_bar.pack(fill=tk.X)

    asyncio.create_task(update_progress_bar(progress_var))

    root.mainloop()

在上面的代码中,我们使用了asyncio.sleep函数来防止阻塞主线程,从而可以不断更新进度条的值。同时,我们使用了asyncio.create_task函数来创建异步任务,这样在进度条更新的同时,我们的GUI程序也可以继续运行。

总结

本文详细讲解了yield from在Python异步编程中的用法,并且给出了两个示例说明。在实际开发中,异步编程可以大大提高程序的性能和响应速度,是值得掌握的一项技能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python异步编程 使用yield from过程解析 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)

    PyCharm是一款流行的Python集成开发环境,可以帮助我们更方便地开发Python应用程序。Pipenv是Python中的虚拟环境管理工具,可以帮助我们更好地管理Python依赖项。本文将详细讲解如何在PyCharm中使用Pipenv新建虚拟环境,包括安装Pipenv、创建虚拟环境、安装依赖项等。 安装Pipenv 要使用Pipenv,我们需要先安装P…

    python 2023年5月15日
    00
  • 以日期为列名的 Python Pandas Pivot() 需要排序和格式化

    【问题标题】:Python Pandas Pivot() with Dates as Column Names Need to Sort and Format以日期为列名的 Python Pandas Pivot() 需要排序和格式化 【发布时间】:2023-04-05 11:19:01 【问题描述】: 我在这里看到了其他 cmets,了解当 pivot()…

    Python开发 2023年4月5日
    00
  • Python GUI程序类写法与Label介绍

    下面就是关于“Python GUI程序类写法与Label介绍”的完整攻略。 Python GUI程序类写法与Label介绍 什么是GUI程序 GUI全称为Graphical User Interface,即图形用户界面,是指使用图形方式显示的计算机操作界面。与CLI(Command-line Interface)相比,GUI更加直观、友好,操作更加简便。 P…

    python 2023年6月6日
    00
  • pytorch 禁止/允许计算局部梯度的操作

    在 PyTorch 中,有些操作可以禁止或允许计算局部梯度,这些操作对于梯度计算、优化算法等都有着重要的影响。本文将详细讲解如何禁止/允许计算局部梯度的操作。 禁止计算局部梯度 有些时候,我们不希望某些操作对梯度产生影响,这时候就需要使用 torch.no_grad() 函数来禁止计算局部梯度。示例如下: import torch x = torch.ten…

    python 2023年5月18日
    00
  • Redis中的BigKey问题排查与解决思路详解

    下面是对Redis中的BigKey问题排查与解决思路的详细讲解。 背景 在使用Redis过程中,可能会遇到BigKey的问题。BigKey指的是占用内存很大的Redis Key,当操作这种Key时,会影响Redis的性能,并且可能会导致Redis进程崩溃。 解决思路 步骤一:找出BigKey 找出BigKey是排查问题的第一步。可以使用Redis的命令red…

    python 2023年5月14日
    00
  • Python实现ATM简单功能的示例详解

    Python实现ATM简单功能的示例详解 ATM简单功能介绍 ATM(Automated Teller Machine)自动取款机是现代化金融服务的标志之一,为人们的生活和工作带来了便捷。下面我们以Python实现ATM简单功能为例来了解ATM自动取款机操作的基本过程。 ATM简单功能大致包括: 插卡操作:用户将银行卡插入ATM机中 输入密码:用户输入银行卡…

    python 2023年5月19日
    00
  • python使用mysql数据库示例代码

    下面是Python使用MySQL数据库的示例代码攻略,包含了数据库连接、数据查询和数据插入等操作。 连接MySQL数据库 在Python程序中连接MySQL数据库,需要先安装MySQL-Python模块。使用以下命令可以安装该模块: pip install mysql-connector-python 连接MySQL数据库的代码示例如下: import my…

    python 2023年6月1日
    00
  • python被修饰的函数消失问题解决(基于wraps函数)

    Python被修饰的函数消失问题解决(基于wraps函数) 在Python中,我们经常会使用装饰器来增强函数的功能,但是使用装饰器可能会引发函数名称、文档字符串、参数列表等元信息丢失的问题。 例如,下面这个被装饰的函数丢失了元信息: def my_decorator(func): def wrapper(): """Wrappe…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部