ホームページ >バックエンド開発 >Golang >Go のスリープ、ティッカー、および受信のブロック: Goroutine のスケジューリングにおける違いは何ですか?

Go のスリープ、ティッカー、および受信のブロック: Goroutine のスケジューリングにおける違いは何ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-07 21:00:26505ブラウズ

Go's Sleep, Tickers, and Blocking Receives: How Do They Differ in Goroutine Scheduling?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。