目次
チャネルの基本的な使用
バッファーチャネルを使用します
双方向コミュニケーションの例
要約します
ホームページ バックエンド開発 Golang 同時プログラミングに進む:チャネルを使用してゴルチン間の通信を実装する

同時プログラミングに進む:チャネルを使用してゴルチン間の通信を実装する

Aug 18, 2025 am 10:24 AM

同時プログラミングに進む:チャネルを使用してゴルチン間の通信を実装する

この記事では、ゴー言語のチャネルを介してゴルチン間のコミュニケーションのメカニズムを深く探ります。サンプルコードを介して、チャネルを使用してゴルチン間でデータ転送を実装する方法と、リソースの漏れやデッドロックの問題を回避するためにGoroutineのライフサイクルを優雅に処理する方法を示します。この記事の目的は、読者がGOの同時プログラミングのコア概念を理解し、チャネルを使用するスキルを習得できるようにすることを目的としています。

チャネルの基本的な使用

Goでは、チャンネルは、ゴロウチン間のデータを渡すために使用できるタイピングされたパイプラインです。チャネルを使用する前にチャネルを作成する必要があり、チャネルを作成して作成できます。

 ch:= make(chan int)// intタイプデータを渡すことができるチャネルを作成する

チャンネルを作成した後、

 Ch <p>デフォルトでは、チャネルの送信および受信操作がブロックされます。つまり、チャネルにデータがない場合、受信するデータが表示されるまで受信操作がブロックされます。チャネルがいっぱいの場合、送信操作は、データを送信するためのチャネルにスペースがあるまでブロックされます。</p><h3>チャネルを使用して、ゴルーチ間通信を実現します</h3><p>次の例は、チャネルを使用して2つのゴルチン間の通信を実装する方法を示しています。</p><pre class="brush:php;toolbar:false">パッケージメイン

「FMT」をインポートする

func send(ch chan <p>この例では、送信関数は0〜9、10整数をチャネルに送信し、チャネルを閉じます。受信関数はチャネルからデータを受信し、受信した値を印刷します。メイン関数はチャネルを作成し、受信ゴルウチンを開始し、送信関数を呼び出します。</p><p><strong>注:</strong></p>
  • 送信関数では、閉じるために閉じる(CH)が使用されます。 Close The Channelは、データが送信されることをGoroutineの受信に通知する重要な操作です。チャネルが閉じられていない場合、Goroutineを受信して新しいデータを待って、デッドロックになります。
  • 受信機能では、for value:= range ch to loopを使用して、チャネル内のデータを受信します。範囲ループは、チャネルが閉じるまでチャネルからデータを受信します。チャネルが閉じられると、範囲ループが自動的に終了します。

バッファーチャネルを使用します

バッファーされていないチャネルに加えて、GOはバッファーチャネルもサポートしています。バッファー付きチャネルは、作成時にバッファーのサイズを指定できます。

 ch:= make(chan int、10)//バッファサイズが10のチャネルを作成します

バッファーチャネルの送信操作は、バッファーがいっぱいの場合にのみブロックされ、受信操作はバッファーが空の場合にのみブロックされます。

双方向コミュニケーションの例

次の例は、2つのチャネルを使用して2つのゴルチン間で双方向通信を実装する方法を示しています。

パッケージメイン

「FMT」をインポートする

FUNC司令官(Commands Chan int、Responses chan int){
    i:= 0; I <p>この例では、Goroutine司令官はコマンドチャネルにコマンドを送信し、応答チャネルから応答を受け取ります。 Responder Goroutineは、コマンドチャネルからコマンドを受信し、Responsesチャネルに2を追加します。</p><p><strong>注:</strong></p>
  • レスポンダー関数では、xを使用して開きます。=
  • 司令官関数は、送信後にコマンドチャネルを閉じ、シャットダウン信号を受信した後、レスポンダー関数が終了します。

要約します

この記事の研究を通じて、次の知識ポイントを習得する必要があります。

  • チャネルの基本的な使用法:データの作成、送信、受信。
  • ゴルチン間のコミュニケーションを実現するためにチャネルを使用する方法。
  • バッファーチャネルの使用方法。
  • ゴルチン間の双方向通信を実現するために2つのチャネルを使用する方法。
  • リソースのリークやデッドロックを避けるために、チャネルを適切に閉じる方法。

これらの知識ポイントを習得することで、GO言語の同時実行特性をよりよく活用し、効率的で信頼できる同時プログラムを作成するのに役立ちます。

以上が同時プログラミングに進む:チャネルを使用してゴルチン間の通信を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

HTTPミドルウェアロギングの例を例に進めます HTTPミドルウェアロギングの例を例に進めます Aug 03, 2025 am 11:35 AM

GOのHTTPログミドルウェアは、リクエストメソッド、パス、クライアントIP、および時間がかかることを記録できます。 1. http.handlerfuncを使用してプロセッサをラップします。2。next.servehttpを呼び出す前後の開始時間と終了時間を記録します。完全なサンプルコードの実行が検証されており、中小のプロジェクトの開始に適しています。拡張機能の提案には、ステータスコードのキャプチャ、JSONログのサポート、リクエストIDトラッキングが含まれます。

SwitchステートメントはGOでどのように機能しますか? SwitchステートメントはGOでどのように機能しますか? Jul 30, 2025 am 05:11 AM

Goのスイッチステートメントは、デフォルトでプロセス全体で実行されず、最初の条件に合わせた後に自動的に終了します。 1.スイッチはキーワードで始まり、1つまたはnoの値を持ち運ぶことができます。 2。上から下へのケースマッチは、最初の一致のみが実行されます。 3.複数の条件をコンマでリストして、同じケースに一致させることができます。 4.手動で休憩を追加する必要はありませんが、強制することができます。 5.デフォルトは、通常最後に配置されている比類のないケースに使用されます。

Jul 29, 2025 am 04:10 AM

Golangの環境変数をどのように操作しますか? Golangの環境変数をどのように操作しますか? Aug 19, 2025 pm 02:06 PM

goprovides-built-built-insupportfor handlingenvironmentvariablesviatheospackage、developerstoread、set、andmanageenvironmentdatasecurelylelyandyly.toreadavariable、useos.getenv( "key")、whoreturnsenemptringtringifthesnoteset、lo

サブプロセスを実行している例で進みます サブプロセスを実行している例で進みます Aug 06, 2025 am 09:05 AM

OS/execパッケージを使用して子プロセスを実行し、exec.commandを介してコマンドを作成しますが、すぐに実行しません。 2。.output()でコマンドを実行し、stdoutをキャッチします。 Exitコードがゼロ以外の場合は、exec.exiterrorを返します。 3。.start()を使用してブロックせずにプロセスを開始し、.stdoutpipe()と組み合わせて出力をリアルタイムでストリーミングします。 4。.stdinpipe()を介してプロセスにデータを入力し、書き込み後、パイプラインを閉じて.wait()を呼び出して最後を待つ必要があります。 5。Exec.exiterrorは、ゾンビプロセスを避けるために、故障したコマンドの出口コードとstderrを取得するために処理する必要があります。

GOのネストされたループから脱却する方法 GOのネストされたループから脱却する方法 Jul 29, 2025 am 01:58 AM

Goでは、ネストされたループから抜け出すには、ラベル付きのブレークステートメントを使用するか、機能を介して戻ります。 1。ラベル付きブレークを使用します:アウターループなどの外側ループの前にタグを配置します。 2。ネストされたループを関数に入れ、条件が満たされたら事前に戻り、それによってすべてのループを終了します。 3.フラグ変数やgotoを使用しないでください。前者は長く間違いを犯すのが簡単で、後者は推奨されません。正しい方法は、タグがそれ以降ではなくループの前でなければならないということです。これは、GOの多層ループから抜け出すための慣用的な方法です。

GOアプリケーションの標準プロジェクトレイアウトは何ですか? GOアプリケーションの標準プロジェクトレイアウトは何ですか? Aug 02, 2025 pm 02:31 PM

答えは次のとおりです。GOアプリケーションには必須のプロジェクトレイアウトがありませんが、コミュニティは一般に、保守性とスケーラビリティを改善するために標準構造を採用しています。 1.CMD/プログラムの入り口を保存します。各サブディレクトリは、CMD/MyApp/Main.goなどの実行可能ファイルに対応しています。 2.内部/保存プライベートコード、外部モジュールによってインポートすることはできず、ビジネスロジックとサービスのカプセル化に使用されます。 3.PKG/ストア他のプロジェクトをインポートするための公に再利用可能なライブラリ。 4.API/オプションでOpenapi、Protobuf、およびその他のAPI定義ファイルを保存します。 5.Config/、Scripts/、およびWeb/Store構成ファイル、スクリプト、Webリソース。 6.ルートディレクトリにはgo.mod and go.sumが含まれています

キャンセルとタイムアウトのためにGOでコンテキストパッケージを使用する キャンセルとタイムアウトのためにGOでコンテキストパッケージを使用する Jul 29, 2025 am 04:08 AM

UseContextTopropagateCancellationandDeadlinesAcrossgoroutines、Cooperativecancellationinhttpservers、Backgroundtasks、andChainedCall.2.WithContext.WithCancel()、CreateAcancellableContextandCallcancel()

See all articles