私の質問:どんな種類のアプリケーションが非常に多くの同時実行スレッドを必要としますか?
1)言語が「スケールする」という事実は、物事がより複雑になったときに、その言語を捨てる必要性が少なくなることを意味します。(これは「製品全体」の概念と呼ばれます。)多くの人々がまさにこの理由でNginxのためにApacheを捨てています。スレッドのオーバーヘッドによって課される「ハードリミット」に近い場合、怖くなり、それを乗り越える方法を考え始めます。Webサイトはトラフィック量を予測することはできません。そのため、スケーラブルにするために少し時間をかけることは合理的です。
2)リクエストごとに1つのゴルーチンが開始されます。内部でゴルーチンを使用する理由はたくさんあります。
- 100の同時リクエストがあるWebアプリを考えてみましょう。ただし、各リクエストは100のバックエンドリクエストを生成します。明らかな例は、検索エンジンアグリゲーターです。しかし、ほとんどすべてのアプリは、画面上の各「エリア」にゴルーチンを作成し、それらを順次ではなく独立して生成できます。たとえば、Amazon.comのすべてのページは150を超えるバックエンドリクエストで構成されており、お客様専用に組み立てられています。これらは順次ではなく並列であり、各「領域」はそれ自体のWebサービスであるため、気付かないでしょう。
- 信頼性と遅延が最も重要なアプリを検討してください。おそらく、各着信リクエストにいくつかのバックエンドリクエストを実行させ、最初に戻ってきたデータを返したいと思うでしょう。
- アプリで行われる「クライアント参加」を検討してください。「要素ごとにデータを取得する」と言う代わりに、ゴルーチンを大量にスピンオフできます。クエリするスレーブDBがたくさんある場合、魔法のようにN倍速くなります。そうしないと、遅くなることはありません。
スレッド/プロセスの数が物理コアの数よりもはるかに大きい場合、ヒットの減少を返します
プログラムをCSPに分割する理由はパフォーマンスだけではありません。実際にプログラムを理解しやすくすることができ、いくつかの問題はより少ないコードで解決できます。
上記のリンクのスライドのように、コードに並行性を持たせることは問題を整理する方法です。ゴルーチンを持たないということは、あなたの言語でMap / Dictonary / Hashデータ構造を持たないようなものです。それなしでも大丈夫です。しかし、一度それを手に入れると、どこでもそれを使い始め、プログラムを本当に単純化します。
以前は、これは「独自のロール」マルチスレッドプログラミングを意味していました。しかし、これは複雑で危険でした-まだレースを作成していないことを確認するためのツールはあまりありません。そして、将来のメンテナーが間違いを犯さないようにするにはどうしますか?大きな/複雑なプログラムを見ると、その方向に多くのリソースを費やしていることがわかります。
並行性はほとんどの言語の第一級の部分ではないため、今日のプログラマーは、なぜ並行性が役立つのかについて盲点を持っています。これは、すべての電話と腕時計が1000コアに向かって進むにつれて明らかになります。Goには、レース検出ツールが組み込まれています。