2

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

4

1 回答 1

1

不,绿色线程根本没有性能优势。

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

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

  • 最多与 CPU 内核一样多的线程可以获得性能优势,因为多个内核可以物理并行执行线程(请参阅 Play!框架)

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

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

  • 多线程是有意义的,因为一个线程可以被阻塞,但其他线程可以继续,所以阻塞只会减慢一个线程
  • 您可以通过将部分阻塞进程实现为一个线程来避免回调地狱。由于您在等待 IO 时可以自由地阻止一个线程,因此您将获得更简单的代码。

绿线

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

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

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

延续给你两全其美:

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

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

于 2016-02-16T19:31:05.630 回答