gpt4 book ai didi

kotlin - 协程中的 IO 会导致暂停吗?

转载 作者:IT老高 更新时间:2023-10-28 13:41:14 25 4
gpt4 key购买 nike

在协程中,我正在使用 OkHttpClient 执行 http 请求。该请求是从具有 suspend 关键字的函数完成的:

suspend fun doSomethingFromHttp(someParam:String): Something {
...
val response = HttpReader.get(url)
return unmarshalSomething(response)!!
}

我假设该函数可以在进入时暂停,因为它具有 suspend 关键字,但是在执行 http-request 时协程也会被暂停吗?其他类型的阻塞 IO 呢?

最佳答案

Kotlin 协程不会自动运行。如果你调用像 HttpReader.get() 这样的阻塞函数,协程不会被挂起,而是调用会阻塞。您可以轻松地向自己保证,给定函数不会导致协程挂起:如果它不是 suspend 函数,则无论是否从 suspend< 调用它都不可能这样做 函数。

如果您想将现有的阻塞 API 转换为非阻塞、可挂起的调用,则必须将阻塞调用提交给线程池。最简单的实现方法如下:

val response = withContext(Dispatchers.IO) { HttpReader.get(url) }

withContext 是一个 suspend fun,它将暂停协程,将提供的 block 提交给另一个协程调度程序(此处为 IO)并在何时恢复该 block 已完成并得出了结果。

您还可以轻松地实例化自己的 ExecutorService 并将其用作协程调度程序:

val myPool = Executors.newCachedThreadPool().asCoroutineDispatcher()

现在你可以写了

val response = withContext(myPool) { HttpReader.get(url) }

关于kotlin - 协程中的 IO 会导致暂停吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49652855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com