在处理 大量网络 I/O、文件 I/O 等场景时,传统同步程序会由于等待阻塞而性能低下。
Python 提供了 asyncio 库支持协程式异步编程,可以高效地同时处理大量任务。
本章将学习:
示例:
import asyncio
async def say_hello():
print("Hello ...")
await asyncio.sleep(1)
print("World!")
asyncio.run(say_hello())
✅ 输出:
Hello ...
(1秒后)
World!
async def 定义协程,await 等待其他协程完成。
示例:
import asyncio
async def task(name):
print(f"{name} 开始")
await asyncio.sleep(1)
print(f"{name} 完成")
async def main():
# 并发执行三个任务
await asyncio.gather(
task("任务1"),
task("任务2"),
task("任务3")
)
asyncio.run(main())
✅ 三个任务会几乎同时开始,而不是顺序等待。
示例:
import asyncio
async def work(n):
await asyncio.sleep(1)
print(f"工作 {n} 完成")
async def main():
tasks = [asyncio.create_task(work(i)) for i in range(5)]
await asyncio.gather(*tasks)
asyncio.run(main())
create_task() 可立即调度任务而无需等待。
示例:
import asyncio
async def producer(q):
for i in range(3):
await q.put(i)
print("生产", i)
async def consumer(q):
while True:
item = await q.get()
print("消费", item)
q.task_done()
async def main():
q = asyncio.Queue()
asyncio.create_task(consumer(q))
await producer(q)
await q.join()
asyncio.run(main())
✅ 常用于生产者-消费者模型。
同步 HTTP 请求会阻塞线程,但可以用 aiohttp 库实现异步:
安装:
pip install aiohttp
示例:
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as resp:
return await resp.text()
async def main():
urls = ["https://httpbin.org/get"] * 5
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
print("共获取到", len(results), "个响应")
asyncio.run(main())
✅ 所有请求会并发发送,极大提高效率。
术语 | 概念 | 实现方式 |
并发 (Concurrency) | 多个任务交替执行,共享一个CPU | asyncio / 协程 |
并行 (Parallelism) | 多个任务同时执行,使用多个CPU核 | multiprocessing 多进程 |
asyncio 是并发,不是并行。计算密集型任务提议用多进程。
技术 | 用途 |
async/await | 定义协程式异步函数 |
asyncio.gather | 并发运行多个协程 |
aiohttp | 异步 HTTP 请求 |
Queue(异步) | 实现生产者-消费者模型 |
✅ 掌握异步编程可以让你构建高性能网络应用、爬虫、I/O密集型程序。