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())

  1. 并发运行多个协程

使用 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 的延迟时间)。

  1. 创建和管理事件循环

你可以通过 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()

  1. 异步网络请求

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())

  1. 异步队列

使用 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 国际许可协议进行许可。