作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从应用程序发送邮件。由于邮件发送需要时间并阻塞主线程,因此我正在创建一个新线程并将邮件发送任务移交给新线程。对于发送邮件的大量并发请求,我必须创建大量线程。但创建线程似乎很慢。
我的问题是,如果我使用 Kotlin 的协程,它是否能提供比线程更好的性能?
某种解释或提示非常值得赞赏。
最佳答案
TL;DR - 在 Kotlin 中工作时始终使用协程
线程具有相对较大的内存占用 - 每个线程大约有 1MB 的 VM 内存。如果为每个任务创建一个线程,则可能会面临内存不足的风险。相比之下,协程相对较小,仅占用几 KB 的虚拟机内存。
新线程的创建相对较慢,因为它要经过操作系统。操作系统对协程一无所知,因此生成一个新的协程相对较快。
出于同样的原因,线程之间的上下文切换比挂起的协程之间的上下文切换要昂贵得多。
此外,协程不太容易发生泄漏,这要归功于 structured concurrency 。
关于multithreading - 在 Kotlin 中使用线程还是协程更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58254985/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!