1744632209
2025-04-14 11:54:00
GOプログラミングコミュニティで時間を過ごした場合、「GOルーチンは安い」というマントラを聞いたことがあるでしょう。それは実質的に福音です。約束は魅惑的です – 汗をかくことなく、数千、数百万、さらには数百万の軽量の糸(ゴロウチン)をスピンアップします。ヘビー級のOSスレッドとは異なり、ゴルチンは、オペレーティングシステムではなく、Goランタイムによって管理されており、おそらくメモリとパフォーマンスの点で汚れたものになります。しかし、ここにあります。ゴルチンは実際に従来のスレッドよりも軽いですが、自由ではありません。それらを作成、管理、破壊するコストは、しばしば光沢がある方法で加算される可能性があります。 「安い」レーベルがよりよく見られるに値する理由を掘り下げましょう。
ゴルチンが安いことについて人々が話すとき、彼らは通常、メモリのオーバーヘッドと速いメモリの2つのことを指しています。ゴロウチンは、OSスレッドに割り当てられた1MB以上と比較して、最近のGOバージョンでは約2kbの控えめなスタックサイズで始まります。 Goランタイムは、ゴルチンをOSスレッドの小さなプールにマルチプレックスするため、ゴルウチンごとに1つのスレッドは必要ありません。掘り出し物のように聞こえますか?
しかし、「安い」という意味ではありません。あなたが作成するすべてのゴルウチンは、消費リソース – スタックのメモリ、スケジューリングのCPU時間、およびライフサイクルを管理するためのランタイムオーバーヘッドです。これらのコストは個別に小さくなる可能性がありますが、数千または数百万のゴロウチンを扱っているときに複合しています。そして、実際のアプリケーションでは、ゴルチンを使用する方法は、バラ色のベンチマークが示唆するよりもはるかに高価にすることができます。
それを分解しましょう。
ゴロウチンの最初の2kbスタックは些細なことに聞こえます。しかし、それはほんの出発点に過ぎません。 Go’s Runtimeは動的なスタック割り当て戦略を使用します。つまり、スタックは必要に応じて成長(および縮小)できます。 Goroutineのコールスタックが深くなった場合 – たとえば、再帰関数や大規模なローカル変数のために、スタックはキロバイト以上に膨らむ可能性があります。 Goのゴミコレクターとスタックシェリンクメカニズムはこれを軽減するのに役立ちますが、コストを完全に排除しません。
#なぜ行くルーチンはあなたが言われたほど安くない #abhinav #コンパスのコーディング #2025年4月