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脚本文件外部传递参数的处理方法

    下面我将为您详细讲解Python脚本文件外部传递参数的处理方法的完整攻略。 什么是Python脚本文件外部传递参数? Python脚本文件外部传递参数,即在运行Python脚本时,通过命令行参数的形式传递变量值给脚本文件进行处理。 如何在Python脚本文件中处理外部传递的参数? Python提供了一个名为sys的标准库,其中包含了一些与Python解释器和…

    python 2023年6月3日
    00
  • python中单例常用的几种实现方法总结

    Python中单例常用的几种实现方法总结 在Python中,单例指的是在一个进程中,某个类仅有一个实例,并提供一个全局的访问点。 本文将总结几种Python中单例模式的实现方法,包括: 使用装饰器 使用类 使用元类 使用装饰器 通过装饰器来实现单例模式,可以避免在类中编写额外的代码。该装饰器可以应用于几乎所有的类。 def singleton(cls): i…

    python 2023年5月19日
    00
  • 全网最细 Python 格式化输出用法讲解(推荐)

    全网最细 Python 格式化输出用法讲解(推荐) 什么是格式化输出? 格式化输出就是指按照一定的格式打印出要输出的信息。Python中有多种格式化输出的方式,其中比较常见的方式有字符串插值、格式化字符串和format方法。 字符串插值 字符串插值就是在字符串中插入一个或多个变量。在Python3.6及以上版本中,可以使用f-string实现字符串插值,即在…

    python 2023年5月20日
    00
  • 基于PyQt4和PySide实现输入对话框效果

    当我们需要在Python GUI应用程序中要求用户输入信息时,可以使用输入对话框(Input Dialog)。可以使用PyQt4或PySide库中的QInputDialog模块来创建输入对话框。以下是步骤: 导入所需模块 首先,需要导入PyQt4或PySide库的QtCore和QtGui模块。此外,还需要导入QInputDialog类。 import sys…

    python 2023年6月3日
    00
  • JavaScript Event学习第四章 传统的事件注册模型

    接下来我将详细讲解JavaScript Event学习第四章的内容,传统的事件注册模型。 什么是传统的事件注册模型? 在传统的事件注册模型中,我们通过JavaScript代码向HTML页面添加事件监听器。当事件发生时,我们的代码将会被调用。事件监听器函数可以手动附加到某个元素,或者在代码中动态创建。传统的事件注册模型使用DOM Level 0事件模型或set…

    python 2023年6月13日
    00
  • Python内建类型list源码学习

    以下是详细讲解“Python内建类型list源码学习”的完整攻略。 在Python中,list是一种非常常用的数据类型,它可以存储多个值,并且可以进行添加、删除、修改等操作。本文将介绍Python内建类型list的源码实现,并提供两个示例说明。 list源码实现 定义 Python的源码中,list的定义如下: typedef struct { PyObje…

    python 2023年5月13日
    00
  • 详解Python是如何处理不同时区的

    详解Python是如何处理不同时区的 Python提供了处理时区和时间的标准库 datetime,该库提供了强大的工具来处理日期和时间。在处理不同时区的问题时,pytz是一个重要的第三方库,可以让Python了解到世界上的时区并进行正确的时区转换。 时区基础 一个时区是相对于协调世界时(UTC)的时间差。以北京时间为例,北京时间使用中国标准时间(CST),其…

    python 2023年6月2日
    00
  • 返回 Word vba 由 Windows 中的 vba 宏调用的 python 脚本的结果

    【问题标题】:Return to Word vba the result of a python script called by the vba macro in Windows返回 Word vba 由 Windows 中的 vba 宏调用的 python 脚本的结果 【发布时间】:2023-04-03 19:53:02 【问题描述】: 我知道如何在 W…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部