【发布时间】:2019-08-06 01:31:22
【问题描述】:
我是 Kotlin/Coroutines 的新手,我注意到使用 CoroutineScope 的两种不同方式。
选项1如下,在任何函数中:
CoroutineScope(Dispatchers.Default).launch {
expensiveOperation()
}
选项 2 是在你的类中实现CoroutineScope 接口,覆盖CoroutineContext,然后你可以使用launch 或async 轻松启动协程:
@Service
class ServiceImpl() : CoroutineScope {
override val coroutineContext: CoroutineContext
get() = Dispatchers.Default + Job()
fun someFunction() {
launch {
expensiveOperation()
}
}
}
我目前正在开发一个后端端点,它将执行以下操作:
- 接受请求
- 将请求上下文保存到数据库中
- 在后台启动一个非阻塞协程对请求执行昂贵/冗长的操作,并立即返回一个http 200。(本质上,一旦我们保存了上下文,我们就可以返回响应并让请求处理背景)
这两个用例有什么区别,对于这种情况,获取CoroutineScope 的首选方法是什么?
这个端点每秒可能会收到多个请求,而冗长的操作需要一两分钟,所以肯定会有多个请求同时处理,来自不同的请求。
另外,如果是选项 2,我是否要将范围/上下文传递给执行繁重处理的函数?或者那是不必要的?例如:
类 ServiceImpl() : CoroutineScope {
override val coroutineContext: CoroutineContext
get() = Dispatchers.Default + Job()
fun someFunction() {
launch {
expensiveOperation(CoroutineScope(coroutineContext))
}
}
private fun expensiveOperation(scope: CoroutineScope)
{
// perform expensive operation
}
}
这是一个 Spring Boot 应用,我使用的是 1.3 版本 Kotlin。
如果您对如何最好地构建此服务类有任何想法/建议,请告诉我。谢谢
【问题讨论】: