- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Jetbrains 在每一篇关于 kotlin 的文章中都谈到了异步编程。但我不明白为什么它们被称为异步?
据我了解 kotlin 协程 - 这是一个带有预初始化线程池的状态机。我们有一个工作线程池和一个 io 线程池。对我来说,这只是一个多线程编程。如果我们向协程发送阻塞代码,一个线程将被阻塞。如果我们使用 async 方法(来自默认协程库),它会给我们一种异步工作的错觉,但这只是将“作业”发送到另一个线程。
如果我们将异步 io 与协程一起使用,还有一个问题。但这是 IO API 异步,而不是 kotlin 协程。与其他语言相比,Java 没有很好的 io async api(可能是错误的)。据我所知,.NET 已经重建了他们的异步 API(作为 IOCP)以使用 C# 任务,并且 .NET 有专用的线程池来等待所有 io 应用程序,因此一个线程可以处理许多 IO 操作。但是 kotlin 协程没有集成到 java nio 中,当我们从协程(有或没有 Dispatcher.IO)调用 nio 时,我们只是要求一个线程等待来自 nio 的数据。 Java NIO 有自己的 epoll 或 iocp 线程池,所以使用 kotlin 协程我们在要求 Dispatcher.IO 给我们一个等待 NIO 结果的线程时会产生开销,然后 NIO 实现创建自己的线程(池)来等待数据从 socket 。而不是一个线程(池)等待,我们现在有两个。
所以协程只允许我们以简单的方式将作业发送到另一个线程。如果您的 api 没有使用 kotlin 协程以异步方式实现,则您无法同时使用一个线程执行多项操作。
最佳答案
他们谈论异步编程是因为协程主要( but not limited to )作为库出售,以使异步编程更容易(主观)。但是正如您正确指出的那样,协程本身没有任何异步性。如果您在协程中执行阻塞代码,它将阻塞底层线程。
但要理解的一点是,协程只有在与挂起函数结合使用时才真正有利,在这种情况下,线程除了等待结果(回调)之外什么都不做。因此,您可以使用同一个线程来执行另外十次这样的调用,而不是等待。
另一个主要优点是使用协程编写的异步代码更容易编写和维护。例如,以下是使用回调的异步调用
fun callAPI(){
getToken{ token ->
auth(token){ authResult ->
doSomething(authResult){ finalResult ->
// use final result
}
}
}
}
这可以简化为使用协程和挂起函数
fun callAPI() = scope.launch(){
val token = getToken()
val authResult = auth(token)
val finalResult = doSomething(authResult)
}
现在您可以使用协程来启动多个长时间运行的阻塞任务,但您看不到任何优势。因为在那种情况下,协程只不过是线程之上的无用抽象。
关于java - 为什么 kotlin 协程被称为异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69222619/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!