2

Is there any benefit to using green threads / lightweight threads over a simple loop or sequential code, assuming only non blocking operations are used in both?

for i := 0; i < 5; i++ {
    go doSomethingExpensive() // using golang example
}

// versus

for i := 0; i < 5; i++ {
    doSomethingExpensive()
}

As far as I can think of
- green threads help avoid a bit of callback hell on async operations
- allow scheduling of M green threads on N kernel threads

But
- add a bit of complexity and performance requiring a scheduler
- easier cross thread communication when the language supports it and the execution was split to different cpu's (otherwise sequential code is simpler)

4

1 に答える 1

1

いいえ、グリーン スレッドにはパフォーマンス上の利点まったくありません。

スレッドがノンブロッキング操作を実行している場合:

  • 物理コアが 1 つしかない場合、複数のスレッドを使用してもメリットはありません (同じコアがすべてを実行する必要があるため、スレッドはオーバーヘッドのために処理を遅くするだけです)。

  • 複数のコアがスレッドを物理的に並列に実行できるため、CPU コアと同じ数のスレッドまでパフォーマンス上の利点があります (Play! フレームワークを参照)。

  • グリーン スレッドは、サブスケジューラによって同じ 1 つの実際のスレッドから実行されているため、利点はありません。したがって、実際にはグリーン スレッド == 1 スレッド

スレッドがブロッキング操作を実行している場合、状況が異なる場合があります。

  • 1 つのスレッドをブロックできますが、他のスレッドは続行できるため、複数のスレッドは理にかなっています。したがって、ブロックすると 1 つのスレッドだけが遅くなります。
  • 部分的にブロックしているプロセスを 1 つのスレッドとして実装するだけで、コールバック地獄を回避できます。たとえば IO の待機中に 1 つのスレッドを自由にブロックできるため、コードがはるかに単純になります。

緑の糸

グリーン スレッドは設計上、実際のスレッドではないため、複数の CPU に分割されず、並列で動作するようには意図されていません。これにより、同期を回避できるという誤った理解が得られる可能性がありますが、実際のスレッドにアップグレードすると、適切な同期の欠如により、一連の問題が発生します。

グリーン スレッドは、JVM が実際の OS スレッドをサポートしていなかった Java の初期に広く使用されていました。ファイバーと呼ばれるグリーン スレッドのバリアントは、Windows オペレーティング システムの一部です。たとえば、MS SQL サーバーは、実際のスレッドを使用する際の大きなオーバーヘッドなしで、さまざまなブロッキング シナリオを処理するためにファイバーを頻繁に使用します。

グリーン スレッドとリアル スレッドだけでなく、継続も考慮することができます( https://www.playframework.com/documentation/1.3.x/asynchronous ) 。

継続により、両方の長所が得られます。

  • コードが線形コードである場合、コードは論理的に次のように見えますが、コールバック地獄はありません
  • 実際には、コードは実際のスレッドによって実行されますが、スレッドがブロックされると、その実行が中断され、別のコードの実行に切り替えることができます。ブロッキング状態が通知されると、スレッドは元に戻り、コードを続行できます。

このアプローチは、非常にリソースに優しいものです。遊ぶ!フレームワークは、使用している CPU コアと同じ数 (4 ~ 8) のスレッドを使用しますが、パフォーマンスに関してはすべてのハイエンド Java アプリケーション サーバーを凌駕しています。

于 2016-02-16T19:31:05.630 に答える