asyncio summary
Posted on Mon 07 October 2024 in Journal
Abstract | asyncio summary |
---|---|
Authors | Walter Fan |
Category | learning note |
Status | v1.0 |
Updated | 2024-10-07 |
License | CC-BY-NC-ND 4.0 |
asyncio 是一个使用 async/await 语法编写并发代码的库。
它是多个 Python 异步框架的基础,这些框架提供高性能的网络和 web-servers、数据库连接库、分布式任务队列等。
asyncio 非常适合处理 IO-bound 和高层次的结构化网络代码。
asyncio 提供了一套高级 API,可以:
- 并发运行 Python 协程,并完全控制其执行;
- 进行网络 IO 和 IPC;
- 控制子进程;
- 通过队列分发任务;
- 同步并发代码;
此外,asyncio 还提供了一些低级 API,供库和框架开发者使用,主要用于:
- 创建和管理事件循环,提供异步的网络、子进程、操作系统信号处理等 API;
- 使用 transports 实现高效的协议;
- 将基于回调的库和代码与 async/await 语法结合使用。
下面是几个典型的 asyncio
用法示例,展示如何使用 async/await
来处理并发任务。
1. 基本的协程执行
这是一个简单的示例,演示如何定义和运行协程任务。
```python import asyncio
async def say_hello(): print("Hello") await asyncio.sleep(1) print("World")
运行协程
asyncio.run(say_hello())
- 并发运行多个协程
使用 asyncio.gather 可以并发运行多个协程。
import asyncio
async def task_one(): await asyncio.sleep(1) print("Task One completed")
async def task_two(): await asyncio.sleep(2) print("Task Two completed")
async def main(): await asyncio.gather(task_one(), task_two())
asyncio.run(main())
输出:
Task One completed Task Two completed
在这个例子中,task_one 和 task_two 会并发执行,执行总时间约为 2 秒(task_two 的延迟时间)。
- 创建和管理事件循环
你可以通过 asyncio.get_event_loop 来创建和管理事件循环,在事件循环中运行协程。
import asyncio
async def main(): print("Running in the event loop")
loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()
- 异步网络请求
asyncio 可以用于异步网络请求,通常搭配 aiohttp 等库来处理网络请求。以下是一个简单示例:
import asyncio import aiohttp
async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text()
async def main(): html = await fetch("http://example.com") print(html)
asyncio.run(main())
- 异步队列
使用 asyncio.Queue 实现生产者-消费者模式。下面是一个生产者和消费者协同工作的示例。
import asyncio
async def producer(queue): for i in range(5): await queue.put(i) print(f"Produced {i}") await asyncio.sleep(1)
async def consumer(queue): while True: item = await queue.get() print(f"Consumed {item}") queue.task_done()
async def main(): queue = asyncio.Queue() await asyncio.gather(producer(queue), consumer(queue))
asyncio.run(main())
输出:
Produced 0 Consumed 0 Produced 1 Consumed 1 ...
在此示例中,producer 将项目放入队列,consumer 从队列中取出并处理项目。
Reference
- https://docs.python.org/3/library/asyncio.html
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。