协程Coroutine
你可能会说
接口在等外部服务时不要把整条执行路径堵住,让协程在等待处挂起,先处理其他请求。
协程是可以在明确暂停点挂起,并在条件满足后继续执行的轻量执行单元。例如接口同时请求三个外部服务,协程在每个 await 等待处让出执行,同一线程可以先推进其他任务,响应回来后再恢复并合并结果。协程不等于新线程,也不保证并行;CPU 密集计算不会因为改成协程就自动变快。
先知道
也常被叫作异步协程Coroutine
延伸阅读 · 权威出处
接口在等外部服务时不要把整条执行路径堵住,让协程在等待处挂起,先处理其他请求。
后续任务不能利用这段 I/O 等待时间。
问题与关键机制:请求等待外部 API 时同步占住执行路径,后续任务只能排队;协程在 await 处保存进度并挂起,以便让出执行权,响应回来后再恢复,让其他协程利用 I/O 等待时间推进。
改善看等待是否被重叠:加入一个慢响应时,其他协程仍能推进且挂起、恢复有记录,说明 I/O 等待被利用;这不证明 CPU 计算并行或一定更快。
聊天附件上传也适合协程:聊天应用同时上传多个附件时,每个上传协程可在等待网络响应时挂起;其他上传继续推进,响应回来再恢复。
请把这三个外部 API 调用改成可并发等待的协程:在 I/O 等待处挂起并让出执行,响应回来后恢复并合并结果。记录挂起、恢复和总耗时;再加入一个慢响应,确认其他请求不会被同步等待堵住。不要声称 CPU 密集计算会因此自动变快。