[Python3高阶编程] - 异步编程深度学习指南一(补充1):深入理解关键词 async
async是 Python 异步编程的基石关键字它和await一起构成了现代 Python 异步 I/O 的核心语法。一、async的核心作用async关键字用于定义“协程函数”coroutine function——一种可以暂停和恢复执行的特殊函数。类比理解普通函数像一条直线从头跑到尾中间不能停。协程函数async def像一条有“检查点”的跑道跑到await处可以暂停让别人先跑等轮到自己再继续。二、async怎么使用——基本语法基本形式async def function_name(parameters): # 函数体 await some_async_operation() # 可选但通常会有 return result示例 1最简单的协程函数async def greet(name): return fHello, {name}! # 调用它 coro greet(Alice) print(type(coro)) # class coroutine —— 返回一个协程对象不是结果⚠️ 注意调用greet(Alice)不会立即执行函数体而是返回一个协程对象coroutine object。三、async defvs 普通def的关键区别全屏复制特性def普通函数async def协程函数调用返回值直接返回结果返回协程对象需await或事件循环执行内部能否用await❌ 不能✅ 可以执行方式立即执行需由事件循环调度执行是否可暂停❌ 不可✅ 在await处可暂停四、如何真正“运行”一个协程函数仅仅调用async def函数不会执行它你需要以下方式之一方式 1在另一个协程中await它推荐async def main(): result await greet(Bob) # ✅ 真正执行并获取结果 print(result) # Hello, Bob!方式 2用asyncio.run()启动顶层入口import asyncio # 在脚本顶层 result asyncio.run(greet(Charlie)) print(result) # Hello, Charlie!方式 3提交给事件循环高级loop asyncio.new_event_loop() task loop.create_task(greet(David)) loop.run_until_complete(task) print(task.result()) # Hello, David!✅最佳实践应用入口用asyncio.run(main())内部协程互相调用用await五、async的常见使用场景场景 1异步 I/O 操作网络、文件、数据库import aiohttp async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text()场景 2并发执行多个任务async def main(): urls [https://a.com, https://b.com] tasks [fetch(url) for url in urls] results await asyncio.gather(*tasks) # 并发获取场景 3异步上下文管理器async def read_file(path): async with aiofiles.open(path, r) as f: # 异步文件操作 return await f.read()场景 4异步生成器async defyieldasync def async_range(n): for i in range(n): await asyncio.sleep(0.1) yield i async def main(): async for x in async_range(3): # 异步迭代 print(x)六、重要规则与限制✅ 规则 1await只能在async def中使用def bad(): await something() # ❌ SyntaxError!✅ 规则 2async def函数必须被正确执行# 错误创建了协程但没执行 greet(Eve) # 警告coroutine greet was never awaited✅ 规则 3不要在async def中调用阻塞函数async def bad_io(): time.sleep(2) # ❌ 阻塞整个事件循环 async def good_io(): await asyncio.sleep(2) # ✅ 非阻塞七、async修饰的其他对象进阶除了函数async还可用于1.异步上下文管理器__aenter__,__aexit__class AsyncResource: async def __aenter__(self): print(Acquiring resource) return self async def __aexit__(self, *args): print(Releasing resource) async def main(): async with AsyncResource() as res: # ✅ pass2.异步迭代器__aiter__,__anext__class AsyncCounter: def __init__(self, n): self.n n self.i 0 def __aiter__(self): return self async def __anext__(self): if self.i self.n: await asyncio.sleep(0.1) self.i 1 return self.i raise StopAsyncIteration async def main(): async for x in AsyncCounter(3): # ✅ print(x)八、常见误区澄清❌ 误区 1“加了async就变快了”✅ 正确async本身不加速只有配合异步 I/O和并发才能提升吞吐量。❌ 误区 2“async def函数会自动并发执行”✅ 正确必须用create_task()或gather()显式并发否则仍是顺序执行。❌ 误区 3“async/await是多线程”✅ 正确默认是单线程事件循环通过协作式多任务实现并发。九、总结async的本质全屏复制问题答案async作用定义可暂停/恢复的协程函数如何使用async def func(): ...调用后发生什么返回协程对象需await或事件循环执行必须搭配什么通常搭配await使用适用场景I/O 密集型任务网络、文件、DB终极口诀“async定义暂停点await触发执行流单线程高并发I/O 等待不再愁。”掌握async你就掌握了 Python 异步编程的第一把钥匙