- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
繁重的 CPU 密集型任务可能会阻塞线程并延迟等待执行的其他任务。那是因为 JVM 不能中断正在运行的线程,需要程序员的帮助和手动中断。
所以在 Java/Kotlin 中编写 CPU 密集型任务需要人工干预才能使事情顺利运行,比如使用 Sequence
在下面的代码中的 Kotlin 中。
fun simple(): Sequence<Int> = sequence { // sequence builder
for (i in 1..3) {
Thread.sleep(100) // pretend we are computing it
yield(i) // yield next value
}
}
fun main() {
simple().forEach { value -> println(value) }
}
据我了解,原因是拥有能够中断正在运行的线程的抢占式调度程序会产生性能开销。
最佳答案
当您使用 Kotlin 协程或 Java 虚拟线程(在 Loom 之后)进行编程时,您会从操作系统获得抢占式调度。
按照惯例,未阻塞的任务(即它们需要 CPU)在 Kotlin 默认调度程序或 Java ForkJoinPool 中的真实操作系统线程上多路复用。这些操作系统线程由操作系统抢先调度。
然而,与旧式多线程不同,任务在等待 I/O 时被阻塞时不会分配给线程。这在抢占方面没有区别,因为等待 I/O 的任务不可能抢占另一个正在运行的任务。
使用协程编程时,您不会得到同时对大量任务进行抢先式调度。如果您有许多需要 CPU 的任务,那么第一个 N 将分配给一个真正的线程,操作系统将对它们进行时间切片。其余的将在队列中等待,直到完成。
但在现实生活中,当您有 10000 个任务需要同时交互时,它们就是 I/O 绑定(bind)任务。平均而言,任何时候都没有太多需要 CPU 的线程,因此您从默认调度程序或 ForkJoinPool 获得的实际线程数是很多的。在正常操作中,等待线程的任务队列几乎总是空的。
如果您真的遇到需要同时交互 10000 个 CPU 密集型任务的情况,那么您无论如何都会感到难过,因为时间切片不会提供非常流畅的体验。
关于java - 为什么 Kotlin/Java 没有抢占式调度程序的选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63302512/
我写了一段代码,其中有一个数据: unsigned char buf[4096]; // data in chunks of size 4k unsigned counter[256]; 我将每 3
这个问题已经有答案了: Ajax too slow - Recursion (1 个回答) 已关闭 5 年前。 所以这件事在我脑海里思考了很长时间,是否 AJAx 中给出的计时器在它必须发送另一个请求
据我所知,在 Linux 中有许多机制可以实现 bottom-halves: 软中断 任务 工作队列 线程中断 ( request_threaded_irq() ) 它们在可调度性方面都有自己的特点。
根据这个问题here使用 pthread_spin_lock 锁定关键部分是危险的,因为线程可能会被调度程序中断,而其他线程可能会在该资源上保持旋转状态。 假设我决定从 pthread_spin_lo
从SLF4J页面我明白了这一点 The purpose of slf4j-log4j12 module is to delegate or redirect calls made to an SLF4
我在我的项目中使用了 xuggle library 将视频从 mp4 转码为 flv。我也使用 slf4j 库 来支持日志结束。 import com.xuggle.mediatool.IMediaR
我是一名优秀的程序员,十分优秀!