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 with
和await
关键字来异步处理网络请求。在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技术站