小编cha*_*onk的帖子

如何理解 Kotlin 协程?

我曾尝试阅读有关 Kotlin 协程的各种教程和页面,尽管这对我来说很有意义,但我仍然觉得它没有点击,我还没有准备好开始使用协程编写异步非阻塞代码。我认为我缺少的是一个图表或图片,说明当一段协程代码执行时究竟发生了什么以及以什么顺序执行。该代码如何在线程级别运行?

    launch {
        delay(1000)
        println("World (${currentThread().name})")
    }
    println("Hello (${currentThread().name})")
    sleep(1500)
Run Code Online (Sandbox Code Playgroud)

我的理解是这样的。我很高兴得到纠正或给出一个不同的例子来进一步理解。

Line0:代码从主线程开始

Line1:在一个新线程上启动一个新的协程(我想来自 forkjoin 池)

Line2:暂停函数,因此协程暂停并将线程返回到线程池(因此是非阻塞的)

Line5:在主线程上打印

Line6:阻塞主线程1.5s

Line3:协程继续执行(不确定这里是哪个线程 - 与暂停前的线程相同还是可以是不同的线程?)。协程在该线程上打印并完成,因此再次将线程返回到池中。

我的另一个问题是,如果我将整个代码包装起来,低级执行将如何改变 runBlocking { ... }

asynchronous async-await kotlin kotlin-coroutines

8
推荐指数
2
解决办法
1448
查看次数

如何使用 Kotlin 协程正确进行阻塞服务调用?

我正在处理一个 http 库(特别是用于进行 graphql 调用的库),它的 API 仅提供阻塞调用,并且是用 Java 编写的。

现在,我正在使用 Kotlin 并使用协程库编写应用程序,这让我想知道应该如何使用协程进行阻塞网络调用。

所以我得到了这段代码:

class DataService(val client: Client) {
    suspend fun getData(request: Request) {
        // process request

        client.makeServiceCall(...)

        //deal with response
    }
}

class Client() {
    suspend fun makeServiceCall(...) {
        library.query(....) //make a network call using the above mentioned library
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否Client.makeServiceCall()应该实际标记为挂起函数,因为它实际上并不挂起,它仅在进行网络调用时才阻塞。DataService.getData()我应该如何从到进行调用makeServiceCall()并仍然遵守结构化并发原则(例如父子协程关系)?

nonblocking blocking coroutine kotlin kotlin-coroutines

4
推荐指数
1
解决办法
6295
查看次数