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 中识别图片中的文字信息,需要使用 OCR 技术(Optical Character Recognition,光学字符识别)。该技术可以将图片中的文本转换为可编辑文本,使得文本的处理、搜索和复制变得更加容易。 下面是用 Python 识别图片中的文字信息的完整攻略。 安装 OCR 库 首先需要安装 OCR 库,可以选择下面两个常用的库: …

    python 2023年5月31日
    00
  • Python 运行一个它不应该运行的 if-case!

    【问题标题】:Python runs a if-case that it should not!Python 运行一个它不应该运行的 if-case! 【发布时间】:2023-04-03 19:06:01 【问题描述】: 我有这个代码: def random_answerlist(self): self.li = [] self.winning_button…

    Python开发 2023年4月8日
    00
  • python中的被动信息搜集

    Python中的被动信息搜集 在Python中,我们可以使用各种库和工具来进行被动信息搜集。被动信息搜集是指在不直接与目标系统交互的情况下,通过收集和分析目标系统的信息来获取有用的信息。本文将介绍Python中的被动信息搜集,并提供两个示例。 示例 以下是两个使用Python进行被动信息搜集的示例: 示例1:使用whois库查询域名信息 import who…

    python 2023年5月15日
    00
  • 如何从 VS Code 中的本地 python 包导入?

    【问题标题】:How to import from local python packages in VS Code?如何从 VS Code 中的本地 python 包导入? 【发布时间】:2023-04-02 13:05:02 【问题描述】: 我的项目结构是这样的: – my_pkg setup.py README.md – my_pkg __init__…

    Python开发 2023年4月8日
    00
  • python中二分查找法的实现方法

    二分查找法是一种常用的查找算法,它可以在有序数组中快速查找指定元素。本文将详细讲解Python中二分查找法的实现方法。 1. 二分查找法的原理 二分查找法的原理是将有序数组分成两部分,然后判断要查找的元素在哪一部分中,再在该部分中继续进行二分查找,直到找到要查找的元素或者确定该元素不存在为止。 具体实现过程如下: 将有序数组的左边界设为0,右边界设为数组长度…

    python 2023年5月14日
    00
  • Python简单定义与使用字典dict的方法示例

    这里是关于“Python简单定义与使用字典dict的方法示例”的攻略。 什么是字典(dict)? 在 Python 编程语言中,字典是一组键值对的数据结构。每个键(key)必须是唯一的,而值(value)可以是任何类型,如列表(list)、元组(tuple)、字符串(str)、数字等。 字典的语法如下: my_dict = {"key1"…

    python 2023年5月13日
    00
  • Pyhton爬虫知识之正则表达式详解

    Python爬虫知识之正则表达式详解 正则表达式是一种用于描述字符串模式的语言,可以用于匹配、查找、替换和割字符串。在Python爬虫,正则表达式是非常重要的一部分,可以用于从网页中提取所需的信息。本文将详细讲解Python爬虫中正则表达式的使用,包括正则表达式语法、re模块的常用函数以及示例说明。 正则表达式语法 正则表达语法是一组特殊符号用于描述字符串模…

    python 2023年5月14日
    00
  • rabbitmq(中间消息代理)在python中的使用详解

    RabbitMQ在Python中的使用详解 RabbitMQ是一个开源的消息代理,它可以在分布式系统中传递消息。在Python中,我们可以使用pika库来连接和操作RabbitMQ。 安装pika库 在使用pika库之前,我们需要先安装它。可以使用pip命令来安装pika库: pip install pika 连接RabbitMQ 在使用pika库连接Rab…

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