Golang の非同期メソッド: 1. 1 つのゴルーチンが別のゴルーチンにリクエストを送信し、応答を待つ同時リクエスト/レスポンス モード; 2. 複数のゴルーチンがチャネルからデータを受信するモード。結果は処理されます。別のチャネルに送信します。
このチュートリアルの動作環境: Windows10 システム、golang1.20.1 バージョン、DELL G3 コンピューター。
Golang は、豊富な同時プログラミング メカニズムを提供する強力かつ効率的なプログラミング言語であり、その重要な機能の 1 つは非同期プログラミングです。非同期プログラミングは、開発者がプログラムのパフォーマンスとスケーラビリティを向上させながら、より良いユーザー エクスペリエンスを提供するのに役立ちます。この記事では、Golang で非同期プログラミングを実装する方法について説明します。
Golang では、ゴルーチンとチャネルを通じて非同期プログラミングを実装できます。 Goroutine は同時実行環境で実行できる軽量のスレッドであり、channel は Goroutine 間の通信に使用されるパイプラインです。
1. goroutine を紹介します。 Goroutine は、Go 言語ランタイム環境によって管理される軽量のスレッドです。ゴルーチンを使用すると、追加のスレッドを作成せずに、プログラム内で複数の関数を同時に実行できます。 go キーワードを使用してゴルーチンを開始します (例:
gofuncName()
上の例では、funcName は関数名です。go キーワードを呼び出すと、関数は新しい goroutine で非同期的に実行されます)。 goroutine を使用すると、プログラムで複数の関数を同時に実行できるため、プログラムの同時実行パフォーマンスが向上します。
2. チャンネルを見てみましょう。チャネルはゴルーチン間の通信のブリッジです。値の送受信に使用できるため、異なるゴルーチン間の同期が可能になります。 Golang では、make 関数を使用してチャネルを作成できます。例:
ch:=make(chandataType)
上記の例では、dataType はチャネルが受信できるデータ型です。ゴルーチン間の同期は、次のようなチャネルを使用して実現できます。
ch<-value//发送数据到channel result:=<-ch//从channel接收数据
上記の例では、ch <- value はチャネルに値を送信することを意味し、<-ch はチャネルからデータを受信することを意味します。チャネルを使用すると、2 つ以上のゴルーチン間の同期とデータ転送を実現できます。
3. 一般的な非同期プログラミング パターンをいくつか紹介します。 1 つ目は、同時リクエスト/レスポンス パターンです。このパターンでは、1 つのゴルーチンが別のゴルーチンにリクエストを送信し、レスポンスを待ちます。これは、ゴルーチンとチャネルを使用して実現できます。例:
funcworker(requestchanint,responsechanint){ for{ req:=<-request//从channel接收请求 //处理请求 result:=req*2//假设这是一个耗时的操作 response<-result//发送响应到channel } } funcmain(){ request:=make(chanint) response:=make(chanint) goworker(request,response) //发送请求 request<-10 //等待响应 result:=<-response fmt.Println(result)//输出20 }
上の例では、ワーカー関数は、リクエストとレスポンスの 2 つのチャネルをパラメータとして受け取ります。無限ループを使用してリクエストをリッスンします チャネルを取得し、リクエストを処理します。結果は応答チャネルに送信されます。 main関数はリクエストとレスポンスを作成します チャネルを作成し、ワーカー関数のゴルーチンを開始しました。 main関数はリクエストに10を送信します チャネルにアクセスし、ワーカーの応答を待って結果を出力します。
もう 1 つの一般的なパターンはファンアウト/ファンイン パターンです。このパターンでは、複数のゴルーチンが 1 つのチャネルからデータを受信し、その結果を別のチャネルに送信する前に処理します。これは、プログラムの処理速度とスループットの向上に役立ちます。例:
funcworker(inputchanint,outputchanint){ for{ data:=<-input//从channel接收数据 //处理数据 result:=data*2//假设这是一个耗时的操作 output<-result//发送结果到channel } } funcmain(){ input:=make(chanint) output:=make(chanint) fori:=0;i<10;i++{ goworker(input,output) } //发送数据 fori:=0;i<10;i++{ input<-i } //等待处理结果 fori:=0;i<10;i++{ result:=<-output fmt.Println(result) } }
上記の例では、ワーカー関数は入力チャネルからデータを受信し、処理後に結果を出力に送信します。 チャネル。 Main 関数は入力と出力を作成します チャネルを作成し、10 個のワーカーゴルーチンを開始しました。 main関数は0から9までのデータを入力に送信します。 チャネルにアクセスし、処理結果を待ちます。処理結果は出力チャネルから受信され、印刷されます。
ゴルーチンとチャネルの使用に加えて、Golang は、ミューテックス ロック (sync.Mutex)、条件変数 (sync.Cond)、アトミック操作 (atomic) などの他の同時実行制御および同期メカニズムも提供します。 。これらのメカニズムは、開発者が同時アクセスを効果的に管理し、共有リソースを操作するのに役立ちます。
実際のアプリケーションでは、非同期プログラミングを正しく使用すると、プログラムのパフォーマンスとスケーラビリティを大幅に向上させることができます。開発者は、実際の状況に応じて適切な同時実行モードを選択し、同時アクセスと共有リソースの問題に慎重に対処する必要があります。
要約すると、Golang は強力な同時プログラミング メカニズムを提供しており、非同期プログラミングはその重要な機能の 1 つです。ゴルーチンとチャネルを使用することで、非同期プログラミングと同時実行制御を簡単に実装できます。実際のアプリケーションでは、開発者はプログラムのパフォーマンスとスケーラビリティを向上させるために、実際の状況に応じて適切な同時実行モードを選択する必要があります。 。
以上がGolangを非同期にする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。