【问题标题】:Kotlin runBlocking and async with returnKotlin runBlocking 和异步返回
【发布时间】:2020-03-23 19:19:12
【问题描述】:

我在 kotlin 协程中迈出了第一步,但遇到了问题。

为了创建Foo 并从函数中返回它,我需要异步调用两个繁重的服务方法来获取Foo 创建的一些值。这是我的代码:

   return runBlocking {
        val xAsync = async {
            service.calculateX()
        }
        val yAsync = async {
            service.calculateY()
        }
        Foo(xAsync.await(), yAsync.await())
    };

但是,在阅读日志后,在我看来 calculateX()calculateY() 是同步调用的。我的代码正确吗?

【问题讨论】:

    标签: kotlin coroutine kotlin-coroutines


    【解决方案1】:

    您的代码并不完美,但在使calculateX()calculateY() 同时运行方面是正确的。但是,由于它在单线程的 runBlocking 调度程序上启动此并发工作,并且由于您的重量级操作是阻塞而不是挂起,因此它们不会被并行化。

    首先要观察的是,与使用 Java 执行器的老式方法相比,阻塞操作无法从协程中获得任何好处,除了更简单的 API。

    第二个观察是,您至少可以通过使用 IO 调度程序使它们并行运行,每个都阻塞自己的线程:

    return runBlocking {
        val xAsync = async(Dispatchers.IO) {
            service.calculateX()
        }
        val yAsync = async(Dispatchers.IO) {
            service.calculateY()
        }
        Foo(xAsync.await(), yAsync.await())
    };
    

    与使用 java.util.concurrent API 相比,您可以从库的 IO 调度程序中受益,而不必创建自己的线程池。

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 2018-01-25
      • 1970-01-01
      • 2019-02-19
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      相关资源
      最近更新 更多