python的asyncio库
时间: 2025-01-02 21:33:17 浏览: 12
### Python `asyncio` 库信息及其使用案例
#### 什么是 `asyncio`
`asyncio` 是用于编写并发代码的应用程序接口,利用异步 I/O、事件循环、协程和任务来实现单线程中的并行操作[^1]。
#### 基本概念
- **协程 (Coroutines)**: 协程是一种特殊的函数,在执行过程中可以暂停并在稍后从中断处继续执行。定义协程的方式是在其前面加上关键字 `async def`。
- **事件循环 (Event Loop)**: 这是 `asyncio` 的核心组件之一,负责管理与调度协程的任务队列。所有的异步任务都在这个循环里运行。
- **任务 (Tasks)**: 将协程封装成一个可被挂起的对象以便于管理和调度。可以通过调用 `asyncio.create_task()` 来创建任务实例。
- **Future**: 表示可能还没有完成的操作的结果;通常由库内部创建,并通过回调机制通知结果的到来。
#### 使用例子
下面是一个简单的例子展示如何使用 `asyncio` 创建两个等待不同时间长度的协程:
```python
import asyncio
async def say_after(delay, what):
await asyncio.sleep(delay)
print(what)
async def main():
task1 = asyncio.create_task(say_after(1, 'hello'))
task2 = asyncio.create_task(say_after(2, 'world'))
# Wait until both tasks are completed (should take around 2 seconds.)
await task1
await task2
# Run the event loop to execute the coroutine.
asyncio.run(main())
```
这段代码展示了基本的 `asyncio` 结构——定义了两个带有延迟打印消息的简单协程,并在一个主函数中启动它们作为独立的任务。最后,使用 `asyncio.run()` 启动整个流程。
#### 并发执行多个任务
如果想要更高效地处理大量相似性质的工作项,则可以考虑如下方式批量提交给事件循环:
```python
import asyncio
async def worker(name, queue):
while True:
sleep_for = await queue.get()
await asyncio.sleep(sleep_for)
print(f'{name} has slept for {sleep_for} seconds')
queue.task_done()
async def main():
num_workers = 2
q = asyncio.Queue()
workers = []
for i in range(num_workers):
w = asyncio.create_task(worker(f'worker-{i}', q))
workers.append(w)
work_items = [5, 1, 8, 3]
for item in work_items:
await q.put(item)
await q.join() # Block until all items have been processed.
# Cancel our worker tasks after processing is complete.
for w in workers:
w.cancel()
await main()
```
此脚本模拟了一个生产者消费者模型,其中有两个工作者不断从队列取出工作项目直到所有都完成了才结束进程。
阅读全文