闭坑指南 · Python#异步 #并发
asyncio 异步常见误区
async 函数必须 await;阻塞调用会卡死整个事件循环。
asyncio 异步常见误区
1. 忘了 await
async def fetch():
return 1
async def main():
fetch() # 返回 coroutine 对象,不会执行!
await fetch() # 正确
2. 在 async 里用阻塞 I/O
time.sleep(5)、requests.get() 会阻塞事件循环,其他协程全停。
改用 await asyncio.sleep(5)、aiohttp 等异步库,或 asyncio.to_thread() 把阻塞丢进线程池。
3. 以为 async 一定更快
async 优势是 高并发 I/O 等待,不是让单次 CPU 计算变快。CPU 密集仍要进程池。
4. 混用线程与 asyncio
可以,但要用 loop.run_in_executor 等明确边界,避免在协程里直接起裸线程改共享状态。
5. 异常被吞
asyncio.gather(..., return_exceptions=True) 要检查返回值;create_task 的异常在 task 里,记得 await 或加 done callback。