跳到正文

协程

Coroutine

高级通用

协程(Coroutine)是一种可在运行中暂停、稍后继续执行的任务,通常由程序或运行时调度。它让后端在等待数据库、网络等结果时先处理别的任务,减少线程被等待占住的时间。

你可能会说:「接口要同时查数据库和调用外部服务,等待其中一个返回时,能不能先处理别的请求?」

读之前建议先了解(这是一个高级概念)

动手看看

查库存商品页协程调度执行库存协程数据库
1

商品页先发来库存请求,后端启动一个协程处理它。

要点

  1. 1

    暂停后还能接着执行

    你可以把一次请求中的操作写成连续的步骤。遇到可暂停的等待时,协程保留当前进度并让出执行机会;等结果回来,再从暂停处继续,代码不必拆成一串回调。

  2. 2

    等待期间可以切换任务

    比如后台调用支付服务时,网络响应还没到。运行时可以先执行其他协程,处理别的请求。这样做的好处是同一段等待时间不必白白占着执行位置。

  3. 3

    阻塞操作会影响调度

    协程能否让出执行机会,取决于所用语言、运行时和调用的库。如果你在协程里直接执行阻塞式数据库调用,它可能仍会占住线程;写了协程,不代表所有等待都会自动变成非阻塞。

容易混淆的地方

协程不是线程:线程通常由操作系统调度,协程的暂停和恢复通常由程序或运行时管理,一个线程也可能轮流执行多个协程。协程也不等于异步操作:异步说的是发起工作后不必原地等结果,协程是组织这类代码的一种方式;具体能否并行运行,还要看运行环境。

什么时候用

适合用

  • 做聚合接口时,需要查询库存、价格和配送服务,可以用协程组织多项等待结果的操作。
  • AI 聊天服务同时处理多个请求,每个请求都要等待模型接口返回时,可以用协程安排这些请求。

不适合用

  • 只是定时执行一次报表生成任务,没有多个等待中的请求要协调,用普通任务调度就够了。
  • 主要工作是持续占满 CPU 的图片编码,协程不能让计算自动并行,可考虑进程或工作线程。

练一练

你做一个商品详情接口:要调用库存和配送服务,两者大部分时间都在等网络响应。哪种方案最能发挥协程的作用?

让 AI 帮你做

请为商品详情接口评估是否使用协程:库存和配送数据来自两个外部服务。先检查当前客户端调用是否会阻塞线程,再给出并发获取、超时和失败处理方案;说明协程能改善哪些等待,哪些地方不能靠它提速。

接下来学什么