Python异步服务依赖事件循环、协程和非阻塞IO协同工作,核心是避免单线程被IO阻塞;async/await用于定义和等待协程,需配合异步库(如httpx、asyncpg)和正确并发控制(如Semaphore、gather),误用同步代码会拖垮性能。

Python异步服务不是靠多线程或多进程堆出来的,而是靠事件循环 + 协程 + 非阻塞IO协同工作的。核心在于让单个线程不被IO卡住,持续处理其他任务。
理解async/await和协程的本质
async def定义的函数不是普通函数,它返回一个协程对象(coroutine object),只有被事件循环调度执行时才会真正运行。await只能出现在async函数里,且后面必须是可等待对象(如另一个协程、asyncio.Future、asyncio.Task,或实现了__await__的对象)。
常见误区:
– 把同步代码直接加async/await不会变快;
– await time.sleep(1)会报错,得用await asyncio.sleep(1);
– 没有await的协程不会执行,就像定义了函数但没调用。
简单例子:
import asyncio
<p>async def fetch_data():
print("开始请求")
await asyncio.sleep(1) # 模拟非阻塞网络延迟
return "数据已就绪"</p><p>async def main():
result = await fetch_data() # 这里才真正执行并等待
print(result)</p><h1>启动事件循环</h1><p>asyncio.run(main())</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/00968c3c2c15" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">Python免费学习笔记(深入)</a>”;</p>登录后复制
用asyncio构建基础异步HTTP服务
推荐用Starlette或FastAPI(底层基于Starlette+Pydantic),它们原生支持async视图,比Flask/Tornado更轻量、更现代。
关键点:
– 路由函数声明为async def;
– 数据库操作要用异步驱动(如asyncpg、aiomysql、tortoise-orm);
– 文件读写避免open(),改用aiofiles;
– 不要混用阻塞调用(如requests.get、json.loads大文件),否则会拖垮整个事件循环。
示例(FastAPI):
标签: mysql python js json go app ai 路由 django
还木有评论哦,快来抢沙发吧~