绿色线程的好处与简单的循环

时间:2016-02-08 20:23:16

标签: green-threads

使用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时,更容易进行跨线程通信(否则顺序代码更简单)

1 个答案:

答案 0 :(得分:1)

不,绿色线程没有任何性能优势

如果线程正在执行非阻塞操作:

  • 如果只有一个物理内核,多个线程没有任何好处(因为同一个内核必须执行所有内容,线程只会因为开销而使速度变慢)

  • 由于多个内核可以物理并行执行您的线程,因此您拥有与CPU内核一样多的线程,因为它们具有性能优势(参见Play!framework)

  • 绿色线程没有任何好处,因为它们是由子调度程序从同一个真实线程运行的,所以实际上是绿色线程== 1个线程

如果线程正在执行阻塞操作,则情况可能会有所不同:

  • 多线程是有道理的,因为一个线程可以被阻止,但其他线程可以继续,所以阻塞只会减慢一个线程
  • 你可以通过将部分阻塞进程实现为一个线程来避免回调地狱。因为你可以自由地阻止一个线程,例如等待IO,你会得到更简单的代码。

绿色线程

绿色线程不是设计上的真正线程,因此它们不会在多个CPU之间拆分,也不会被并行处理。这可能会给你一个错误的修正,你可以避免同步 - 但是一旦你升级到真正的线程,缺乏适当的同步将引入一系列好的问题。

绿色线程在Java早期广泛使用,当时JVM不支持真正的OS线程。称为Fibers的绿色线程的变体是Windows操作系统的一部分,例如, MS SQL服务器大量使用它们来处理各种阻塞方案,而不会产生使用真实线程的巨大开销。

您不仅可以选择绿色线程和真实线程,还可以考虑延续https://www.playframework.com/documentation/1.3.x/asynchronous

Continuations为您提供两全其美的优势:

  • 你的代码在逻辑上看起来像是一个线性代码,没有回调地狱
  • 实际上代码是由真实线程执行的,但是如果线程被阻塞,它会暂停执行,并可以切换到执行其他代码。一旦阻塞条件发出信号,线程就可以切换回来继续你的代码。

这种方法非常适合资源。玩!框架使用与您拥有的CPU核心一样多的线程(4-8),但在性能方面胜过所有高端Java应用服务器。