Kotlin 协程 - 在 api 调用和 return api 调用中启动函数而无需等待

Kotlin coroutines - Kick off function in api call and return api call without waiting

我有一个 api 电话,我想开始一个漫长的 运行 工作,然后 return 200 ok。目前它将开始工作并继续前进,但是一旦初始函数完成了它需要做的事情,它似乎仍在等待协程完成。我确定这与我对 kotlin 协同程序的较新理解有关。

fun apiCall() {
   log.info("started")
   longJob()
   log.info("finished")
   
   return ResponseEntity.ok()
}

fun longJob() {
   runBlocking{
      launch {
        do stufff...
      }
   }
}

所以基本上我希望看​​到日志打印,然后启动 longJob,然后在邮递员中看到 200。但实际上我正在打印两个日志以及开始工作,但是直到工作完成我才看到我的 200ok。

如果我理解正确,您想在后台启动 longJob,并且 return 200ok 状态不等待 longJob 完成。如果是这种情况,那么您不能在此处使用 runBlocking,它会阻塞当前线程,直到其中启动的所有作业完成。您可以创建一个 CoroutineScope 并启动并忘记一个很长的 运行 任务。示例代码:

val scope = CoroutineScope(Dispatchers.IO) // or CoroutineScope(Dispatchers.IO + SupervisorJob())

fun apiCall() {
   log.info("started")
   scope.launch { longJob() }
   log.info("finished")
   
   return ResponseEntity.ok()
}

在此示例中,日志“started”和“finished”将在 longJob() 开始执行之前打印。