点击头像,进入个人中心,查看文章合集,还有更多Python相关的精彩教程等着你!
在第 7 章中我们学习了 多线程,但由于 GIL 限制,它更适合 I/O 密集型任务。
Python 提供了另一种并发模型:异步编程 (Asynchronous Programming)。
使用 async def 定义协程函数,调用时不会立即执行,而是返回一个 协程对象。
示例:
import asyncio
async def say_hello():
print("Hello")
await asyncio.sleep(1) # 异步等待
print("World")
asyncio.run(say_hello())
✅ 输出结果:
Hello
World (延迟 1 秒)
asyncio.gather 可以并发运行多个协程。
示例:
import asyncio
async def worker(name, delay):
print(f"任务 {name} 开始")
await asyncio.sleep(delay)
print(f"任务 {name} 完成")
async def main():
await asyncio.gather(
worker("A", 2),
worker("B", 1),
worker("C", 3),
)
asyncio.run(main())
✅ 输出结果(并发执行):
任务 A 开始
任务 B 开始
任务 C 开始
任务 B 完成
任务 A 完成
任务 C 完成
asyncio.create_task 可显式创建任务,使多个协程并发运行。
示例:
import asyncio
async def task(name, delay):
await asyncio.sleep(delay)
print(f"任务 {name} 完成")
async def main():
t1 = asyncio.create_task(task("X", 2))
t2 = asyncio.create_task(task("Y", 1))
print("等待任务完成...")
await t1
await t2
asyncio.run(main())
✅ 输出结果:
等待任务完成...
任务 Y 完成
任务 X 完成
示例:
import asyncio
async def slow_task():
await asyncio.sleep(5)
return "完成"
async def main():
try:
result = await asyncio.wait_for(slow_task(), timeout=2)
print(result)
except asyncio.TimeoutError:
print("任务超时!")
asyncio.run(main())
✅ 输出结果:
任务超时!
asyncio.Queue 用于协程间的任务通信。
示例:
import asyncio
async def producer(queue):
for i in range(5):
await queue.put(i)
print(f"生产: {i}")
await asyncio.sleep(1)
async def consumer(queue):
while True:
item = await queue.get()
print(f"消费: {item}")
queue.task_done()
async def main():
queue = asyncio.Queue()
producer_task = asyncio.create_task(producer(queue))
consumer_task = asyncio.create_task(consumer(queue))
await producer_task
await queue.join()
consumer_task.cancel()
asyncio.run(main())
✅ 输出结果(生产者和消费者并发运行):
生产: 0
消费: 0
生产: 1
消费: 1
...
异步编程中也可以使用 async with 来管理资源。
示例:
import asyncio
class AsyncContext:
async def __aenter__(self):
print("进入异步上下文")
return "资源对象"
async def __aexit__(self, exc_type, exc, tb):
print("退出异步上下文")
async def main():
async with AsyncContext() as res:
print("使用:", res)
asyncio.run(main())
✅ 输出结果:
进入异步上下文
使用: 资源对象
退出异步上下文
异步编程在 网络编程、爬虫、高并发服务 中超级高效。