078、async/await语法:协程的编写与调度
078、async/await语法:协程的编写与调度
从一次深夜调试说起
上周排查一个线上服务的问题,日志显示某个接口平均响应时间从50ms飙升到2秒。用perf抓了堆栈,发现大量线程卡在I/O等待上——典型的“同步阻塞”病发症状。翻看代码,果然发现某位同事在HTTP请求回调里直接调用了同步的MySQL驱动。这种场景,正是async/await该出场的时候。
协程不是线程
很多人第一次接触async/await,会下意识把它理解成“轻量级线程”。这个类比其实挺误导人。协程的本质是可暂停的函数,它的切换完全在用户态完成,不需要内核参与。一个线程里可以跑成千上万个协程,但同一时刻真正执行的只有一个。
# 错误示范:把协程当线程用asyncdeffetch_data():time