如何:在 Kotlin 中触发并忘记异步协程
How to: fire and forget async coroutines in Kotlin
我一直在阅读 Kotlin 协程,但没有找到特定问题的答案。
假设我想迭代一个集合,对每个元素进行 API 调用(在这种特殊情况下将文件推送到 Amazon S3)。我希望这些调用由异步协程处理,以免在等待时阻塞底层线程。
我不需要请求中的 return 值,仅用于记录异常。
我将如何创建一个 "fire and forget" 异步协程来发出这些请求之一?
也许kotlinx.coroutines#launch or kotlinx.coroutines#async能满足您的需求。例如:
launch(CommonPool) {
for(item in collection){
val result = apiCall(item);
log(result);
}
}
或
for(item in collection){
launch(CommonPool) {
val result = apiCall(item)
log(result)
}
}
请注意,如果不存在特定的协程范围(不是挂起函数,即),您可以使用:
fun Process (item: String): Response {
GlobalScope.launch {
... <YOUR ASYNC (Processing) CODE GOES HERE> ...
}
... <YOUR SYNC CODE GOES HERE> ...
return Response("Your request for $item is being processed...")
}
通过这种方式,您可以return 快速回答(作为确认)说明已收到并且您正在处理它,而不会以即刻即忘的方式阻止 client/consumer。
但是当异步部分引发异常时要小心可能的内存泄漏。扩展 CoroutineScope 是一种更好的方法。更多信息请见 https://discuss.kotlinlang.org/t/unavoidable-memory-leak-when-using-coroutines/11603/7 and
我一直在阅读 Kotlin 协程,但没有找到特定问题的答案。
假设我想迭代一个集合,对每个元素进行 API 调用(在这种特殊情况下将文件推送到 Amazon S3)。我希望这些调用由异步协程处理,以免在等待时阻塞底层线程。
我不需要请求中的 return 值,仅用于记录异常。
我将如何创建一个 "fire and forget" 异步协程来发出这些请求之一?
也许kotlinx.coroutines#launch or kotlinx.coroutines#async能满足您的需求。例如:
launch(CommonPool) {
for(item in collection){
val result = apiCall(item);
log(result);
}
}
或
for(item in collection){
launch(CommonPool) {
val result = apiCall(item)
log(result)
}
}
请注意,如果不存在特定的协程范围(不是挂起函数,即),您可以使用:
fun Process (item: String): Response {
GlobalScope.launch {
... <YOUR ASYNC (Processing) CODE GOES HERE> ...
}
... <YOUR SYNC CODE GOES HERE> ...
return Response("Your request for $item is being processed...")
}
通过这种方式,您可以return 快速回答(作为确认)说明已收到并且您正在处理它,而不会以即刻即忘的方式阻止 client/consumer。
但是当异步部分引发异常时要小心可能的内存泄漏。扩展 CoroutineScope 是一种更好的方法。更多信息请见 https://discuss.kotlinlang.org/t/unavoidable-memory-leak-when-using-coroutines/11603/7 and