Python 中的协程和异步编程可以让我们更加高效地处理 I/O 密集型任务,避免了多线程和多进程中的上下文切换开销。在本回答中,我们将重点介绍 Python 的协程和异步编程库 asyncio。
协程
协程是一种轻量级的线程,它可以在单线程内实现并发执行。Python 支持通过 async 和 await 关键字来定义协程。以下是一个简单的协程示例:
import asyncio
# 定义协程函数
async def hello():
print('Hello')
await asyncio.sleep(1)
print('World')
# 创建事件循环并运行协程
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
在上面的示例中,我们定义了一个协程函数 hello(),它先打印出“Hello”,然后等待 1 秒钟并打印出“World”。在主程序中,我们创建了一个事件循环并使用 run_until_complete() 方法来运行这个协程。
异步编程(asyncio)
Python 提供了一个内置的异步编程库 asyncio,它可以帮助我们更加方便地使用协程和事件循环进行异步编程。以下是一个简单的 asyncio 示例:
import asyncio
# 定义协程函数
async def hello():
print('Hello')
await asyncio.sleep(1)
print('World')
# 创建事件循环并运行协程
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
在上面的示例中,我们使用 asyncio.sleep() 函数来模拟一个耗时的 I/O 操作,并通过事件循环来执行协程。需要注意的是,在异步编程中,应该尽量避免使用阻塞式操作,否则会影响事件循环的效率。
除了协程和事件循环,asyncio 还提供了许多工具和库,如异步网络库、异步数据库驱动程序等,可以方便地进行各种异步 I/O 操作。例如,我们可以使用 aiohttp 库来实现异步 HTTP 请求:
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'https://www.example.com')
print(html)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
在上面的示例中,我们使用 aiohttp 库来发送异步 HTTP 请求,使用 aiohttp.ClientSession() 来创建一个异步的 HTTP 客户端会话,并使用 fetch() 协程函数来发送请求并返回响应内容。在主程序中,我们通过事件循环运行 main() 协程函数。
Python的协程和异步编程库asyncio能有效处理I/O密集型任务,避免上下文切换开销。async和await关键字用于定义协程,例如示例中定义的hello()协程。asyncio提供事件循环和工具进行异步操作,如asyncio.sleep()和aiohttp库进行异步HTTP请求。
711

被折叠的 条评论
为什么被折叠?



