【问题标题】:How to: fire and forget async coroutines in Kotlin如何:在 Kotlin 中触发并忘记异步协程
【发布时间】:2017-11-30 16:05:27
【问题描述】:

我一直在阅读 Kotlin 协同程序,但没有找到特定问题的答案。

假设我想迭代一个集合,为每个元素调用 API(在这种特殊情况下,将文件推送到 Amazon S3)。我希望这些调用由异步协程处理,以免在等待时阻塞底层线程。

我不需要请求的返回值,只需要记录异常。

我如何创建一个“即发即弃”的异步协程来发出这些请求之一?

【问题讨论】:

    标签: asynchronous kotlin coroutine


    【解决方案1】:

    请注意,如果不存在特定的协程范围(不是挂起函数,即),您可以使用:

    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...")
    }
    

    通过这种方式,您可以以 Fire&Forget 方式返回一个快速回答(充当确认),说明它已被接收并且您正在处理它,而不会阻止客户/消费者。

    但是,例如,当异步部分引发异常时,请注意可能的内存泄漏。扩展 CoroutineScope 是一种更好的方法。更多信息请访问https://discuss.kotlinlang.org/t/unavoidable-memory-leak-when-using-coroutines/11603/7Why not use GlobalScope.launch?

    【讨论】:

      【解决方案2】:

      也许kotlinx.coroutines#launchkotlinx.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)
          }
      }
      

      【讨论】:

      • launch 必须放在协程范围内。创建作用域的典型方法是阻塞:runBlocking 运行一个新的协程并中断当前线程直到其完成,coroutineScopewithContext 是一个挂起函数,OP 希望避免挂起。我相信 OP 想要实现类似于 Java 的 executors 的东西,你可以简单地写:executor.submit(job) 并忘记。
      • 如果您没有办法创建非阻塞作用域,这不是答案。
      猜你喜欢
      • 2014-12-06
      • 2013-09-01
      • 1970-01-01
      • 2020-04-25
      • 2016-06-21
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多