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

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日

相关文章

  • 如何使用Python在MySQL中创建索引?

    要使用Python在MySQL中创建索引,可以使用Python的内置模块sqlite3或第三方库mysql-connector-python。以下是使用mysql-connector-python在MySQL中创建索引的完整攻略: 连接 要连接到MySQL,需要提供MySQL的主机、用户名、和密码。可以使用以下代码连接MySQL: import mysql.…

    python 2023年5月12日
    00
  • 详解Pycharm第三方库的安装及使用方法

    Pycharm第三方库的安装及使用方法 Pycharm是一款流行的Python集成开发环境,可以方便地安装和使用第三方库。本文将详细讲解Pycharm第三方库的安装及使用方法,包括如何使用Pycharm的包管理器、如何手动安装第三方库、如何使用第三方库等。 使用Pycharm的包管理器 Pycharm的包管理器可以方便地安装和管理第三方库。以下是一个示例,演…

    python 2023年5月15日
    00
  • Python中模块的使用–binascii模块用法

    好的。首先,binascii模块主要用于二进制和ASCII编码之间的相互转换以及各种二进制数据的编码和解码,提供了许多有用的工具函数。接下来我会详细介绍binascii模块的用法,并提供两个示例说明。 一、binascii模块的常用函数 1.1 binascii.hexlify() 用于将二进制数据转换成十六进制字符串。 示例: import binasci…

    python 2023年6月3日
    00
  • 在Python-NumPy中获取切比雪夫数列对数据的最小二乘法拟合

    获取切比雪夫数列对数据的最小二乘法拟合,可以使用Python的NumPy库中polyfit函数来实现。下面是具体的攻略: 1.导入相应的库为使用NumPy库中的polyfit函数,我们需要首先导入NumPy库和matplotlib库。代码如下: import numpy as np import matplotlib.pyplot as plt 2.加载数据…

    python-answer 2023年3月25日
    00
  • python中的集合及集合常用的使用方法

    下面是“Python中的集合及集合常用的使用方法”完整攻略。 什么是集合 在Python中,集合是一种基本的数据结构,是一组无序的、唯一的元素的集合。Python中的集合类似于数学中的集合,因此它们支持集合的运算,如并集、交集、差集等。 集合的创建 Python中的集合用花括号 {} 表示,元素之间使用逗号分隔。例如,创建一个包含整数1、2、3的集合,可以使…

    python 2023年5月13日
    00
  • Python正则re模块使用步骤及原理解析

    以下是“Python正则re模块使用步骤及原理解析”的完整攻略: 一、问题描述 在Python中,正则表达式是一种用于匹配和处理文本数据的强大工具。re模块是Python中用于处理正则表达式的标准库。本文将详细讲解Python正则re模块的使用步骤及原理解析,以及如何在实际开发中应用。 二、解决方案 2.1 re模块使用步骤 在Python中,使用re模块处…

    python 2023年5月14日
    00
  • 【manim动画教程】– 文本样式

    文本的样式主要指颜色和字体相关的属性设置。 对于manim的两个文本对象 Text和 Tex来说,Text对象有更多的属性可以调整样式,相对来说,由于 Tex主要用来显示数学公式,所以关于样式的属性要少一些。 下面介绍一些我在视频制作时最常用的一些颜色和字体相关的属性。 1. 颜色相关 颜色设置主要分为单色,渐变色两种,对于 Text对象,manim还提供了…

    python 2023年4月18日
    00
  • python中的字符转运算符、字符串处理方式

    下面是关于Python中字符转换操作符以及字符串处理方式的详细攻略。 字符转换操作符 在Python中,使用字符转换操作符可以将一个字符转换为其对应的ASCII码值或者将一个整数值转换为其对应的字符。 将字符转换为ASCII码值 可以使用内置函数ord()将一个字符转换为对应的ASCII码值。 # 字符转ASCII码值 char = ‘a’ ascii_va…

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