【问题标题】:Kotlin/Native: How to perform blocking calls asynchronously?Kotlin/Native:如何异步执行阻塞调用?
【发布时间】:2021-07-13 10:08:58
【问题描述】:

截至目前,Kotlin/Native 是单线程的。因此,下面的代码会被sleep屏蔽掉:

coroutineScope {
  launch { plaform.posix._sleep(100000) }
  launch { println("Hello")             }
}

但是,它有一个新的并发机制,称为Workers。然而,即使使用 worker,主线程也会被长时间运行的 posix 调用阻塞:

coroutineScope {
  launch { Worker.start().execute(TransferMode.SAFE, { }, { plaform.posix._sleep(100000) }).consume{ } }
  launch { println("Hello") }
}

上面的两个 sn-ps 都不会打印Hello

异步执行一系列昂贵的阻塞调用的正确方法是什么?

【问题讨论】:

    标签: kotlin kotlin-multiplatform kotlin-native


    【解决方案1】:

    K/N 有一个多线程版本的 kotlin 协程,它目前位于一个单独的分支上:native-mt

    您可以使用Dispatchers.Default 将任务卸载到后台线程

    【讨论】:

      【解决方案2】:

      所以,问题是我使用了consume 方法,它阻塞了主线程。

      相反,你需要执行worker,然后手动检查它是否完成:

      val job = Worker.start().execute(TransferMode.SAFE, { }) { plaform.posix._sleep(100000) }
      ...
      if (job.state == FutureState.Computed)
         job.result
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-24
        相关资源
        最近更新 更多