【问题标题】:Difference between Job and Deferred in Coroutines KotlinCoroutines Kotlin 中 Job 和 Deferred 的区别
【发布时间】:2019-04-24 23:22:01
【问题描述】:

我是协程新手,我了解launchasync,但仍然令人困惑的是DeferredDeferred 是什么?以及JobDeferred 之间的区别。清晰的解释和示例更有帮助。提前致谢。

【问题讨论】:

    标签: android kotlin deferred kotlin-coroutines


    【解决方案1】:

    所以job 是一种代表协程执行的对象,并且与structured concurrency 相关,例如您可以取消作业,该作业的所有子作业也将被取消。

    来自docs

    工作是一个可取消的事物,其生命周期在其完成时达到高潮。

    Deferred 是Java 中Future 的某种类似物:in 封装了一个操作,该操作将在其初始化后的某个时间点完成。但也与 Kotlin 中的协程有关。

    来自文档:

    延迟值是一个非阻塞可取消的未来——它是一个有结果的作业。

    所以,Deferred 是一个有结果的Job

    deferred 值是JobcoroutineContextasync 构建器中的 job 代表协程本身。

    一个例子:

    someScope.launch {
        val userJob: Deferred<User> = async(IO) { repository.getUser(id) }
        //some operations, while user is being retrieved 
        val user = userJob.await() //here coroutine will be suspended for a while, and the method `await` is available only from `Deferred` interface
        //do the job with retrieved user
    }
    

    此外,可以使用现有范围构建此 async 请求,但这是另一个问题的讨论。

    【讨论】:

    • 感谢 llyunin,可以用一段代码片段解释更多帮助
    • @MageshPandian,我已经编辑了答案。此外,Deferred 接口还扩展了一些其他方便的方法,但它们现在被标记为实验性(Kotlin 1.3)
    • 我认为值得指出 exception handling 的差异,这在某些用例中可能很重要; launch 立即抛出,而 async 在调用 await() 时将异常作为“结果”抛出。
    • @Pawel 还有一点很重要:async 也立即取消其父作业,然后将取消传播到所有其他async 任务。无论您是否await,都会发生这种情况。您可以通过使用 SupervisorJob 作为父级来防止这种情况,但这会滥用机制。
    【解决方案2】:

    在基本层面上,Deferred 是一个未来。它使一个协程可以等待另一个协程产生的结果,将自身挂起,直到它准备好。调用async 是一种方法,但到目前为止还不是唯一的方法来获得Deferred

    但是,我认为您的问题更多是关于基础知识:何时使用launch,何时使用async-await。这是一个重要的教训:您可能不需要异步。人们倾向于使用它,因为关键字 asyncawait 在其他语言中很熟悉,但在 Kotlin 中,async 并不是实现非阻塞调用的通用工具。

    以下是关于如何将阻塞调用转变为挂起、非阻塞调用的基本方法:

    uiScope.launch {
        val ioResult = withContext(Dispatchers.IO) { blockingIOCall() }
        ... just use the result, you're on the GUI thread here.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-01
      • 2020-07-08
      • 2017-06-14
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      相关资源
      最近更新 更多