使用green threads / lightweight threads
对简单的循环或顺序代码有什么好处,假设两者都只使用非阻塞操作?
for i := 0; i < 5; i++ {
go doSomethingExpensive() // using golang example
}
// versus
for i := 0; i < 5; i++ {
doSomethingExpensive()
}
据我所知,
- 绿色线程有助于避免异步操作中的一些回调地狱
- 允许在N个内核线程上安排M个绿色线程
但是
- 增加一些复杂性和性能需要调度程序
- 当语言支持并且执行被拆分为不同的cpu时,更容易进行跨线程通信(否则顺序代码更简单)
答案 0 :(得分:1)
不,绿色线程没有任何性能优势。
如果只有一个物理内核,多个线程没有任何好处(因为同一个内核必须执行所有内容,线程只会因为开销而使速度变慢)
由于多个内核可以物理并行执行您的线程,因此您拥有与CPU内核一样多的线程,因为它们具有性能优势(参见Play!framework)
绿色线程没有任何好处,因为它们是由子调度程序从同一个真实线程运行的,所以实际上是绿色线程== 1个线程
绿色线程不是设计上的真正线程,因此它们不会在多个CPU之间拆分,也不会被并行处理。这可能会给你一个错误的修正,你可以避免同步 - 但是一旦你升级到真正的线程,缺乏适当的同步将引入一系列好的问题。
绿色线程在Java早期广泛使用,当时JVM不支持真正的OS线程。称为Fibers的绿色线程的变体是Windows操作系统的一部分,例如, MS SQL服务器大量使用它们来处理各种阻塞方案,而不会产生使用真实线程的巨大开销。
您不仅可以选择绿色线程和真实线程,还可以考虑延续(https://www.playframework.com/documentation/1.3.x/asynchronous)
Continuations为您提供两全其美的优势:
这种方法非常适合资源。玩!框架使用与您拥有的CPU核心一样多的线程(4-8),但在性能方面胜过所有高端Java应用服务器。