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()
开始执行之前打印。
我有一个 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()
开始执行之前打印。