Go の Sleep と Select の動作を理解する
指定された期間待機したり、チャネルからデータを受信したりするなどのブロック操作を実行するとき、 Go では、さまざまなテクニックを利用して goroutine のスケジュールを管理します。これらの操作の動作は、使用される特定の方法によって異なります。これらのアプローチの違いを見てみましょう。
time.Sleep
time.Sleep は、現在の goroutine を指定された期間一時停止し、CPU が他のタスクを実行できるようにします。内部的には、time.Sleep は Go ランタイムと対話して、コールバック関数を持つタイマーを作成します。タイマーが期限切れになると、コールバックは goready を呼び出してスリープ中の goroutine を起動します。
time.NewTicker
time.NewTicker は、チャネルを生成する *Ticker オブジェクトを作成します。信号は特定の間隔で刻まれます。ティッカーは内部で runtime.timer コールバック関数を使用し、有効期限が切れたときにチャネルで現在時刻を送信します。待機/スケジューリングは、チャネルからの受信操作中に発生します。
Blocking Receive (<- chan)
チャネルでの受信をブロックすると、データが利用可能になるまで goroutine が一時停止されます。またはチャネルが閉じられています。この操作は chanrecv によって実装され、最終的に goparkunlock を呼び出して、他の goroutine が実行できるように goroutine をパークします。
リソース消費の比較
例の otherChan チャネルが残っていると仮定します。空の場合、3 つのオプションは異なるリソース消費パターンを示します。 time.Sleep が最も効率的で、次に time.NewTicker が続きます。受信 (
概要
低レベルで言えば、time.Sleep はランタイムと直接対話して、指定された時間が経過するまで goroutine を実行します。 time.NewTicker は、チャネル上でティック イベントを通知するタイマー コールバックを利用し、実際の待機はチャネルからの受信操作中に発生します。受信操作をブロックすると、データが利用可能になるまでゴルーチンが一時停止され、より複雑な通信シナリオが可能になりますが、リソース使用量が増加する可能性があります。
以上がGo のスリープ、ティッカー、および受信のブロック: Goroutine のスケジューリングにおける違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。