- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果协程仍然使用线程并行运行代码,为什么它被认为是轻量级的?
据我了解,kotlin 的 suspend
函数由编译器转换为状态机,其中每个分支都可以在开发人员定义的相同或不同线程上运行。协程构建器,例如 launch{}
,对此负责,CoroutineContext
是定义要运行的线程的内容。
通过将代码块发送到利用相同线程的线程池来实现并行性
有一个关于 100k 协程和 100k 线程的基准测试,其中协程没有问题地通过并且线程抛出异常(可能是 OutOfMemory)。它让我想到我在这里遗漏了一些东西。
你能帮我理解这里遗漏了什么,是什么让协同程序并行运行代码块 100k 而不会像线程那样超出内存限制?
最佳答案
指向article
Every
Thread
has its own stack, typically 1MB. 64k is the least amount of stack space allowed per thread in the JVM while a simple coroutine in Kotlin occupies only a few dozen bytes of heap memory.
Continuation
这样的回调来管理暂停和恢复。它作为最后一个参数添加到标有
suspend
的函数中编译时的关键字与其他对象一样位于堆中并负责协程的恢复,因此 RAM 中不需要数千 MB 的空间来保持所有线程的事件。使用
CommonPool
最多创建典型的 60-70 个线程并被重用(如果创建了新的协程,它会等到另一个完成)。
关于multithreading - 为什么 kotlin 协程被认为是轻量级的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63719766/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!