非同期プログラミングを使用すると、メインスレッドをブロックせずにタスクを実行できます。 Go 言語は、軽量のスレッド goroutine と通信パイプ チャネルを使用して、非同期プログラミングを実装します。ゴルーチンは go キーワードを使用して作成され、チャネルはゴルーチン間でデータを送受信するために使用されます。実際のケース: 同時 Web リクエストは、チャネルを使用してリクエスト応答を受信し、ゴルーチンを通じて HTTP GET リクエストを同時に送信します。メインスレッドはチャネルから応答を受信し、結果を出力することで、プログラムのパフォーマンスと応答性が向上します。
Go 言語関数の非同期プログラミングの実践
非同期プログラミングは、プログラマが複数のタスクを同時に実行できるようにする並列プログラミングのテクノロジです。メインスレッドをブロックします。 Go 言語では、goroutine
と channel
を使用して非同期プログラミングを簡単に実装できます。
Goroutine
Goroutine は Go 言語の軽量スレッドです。従来のスレッドとは異なり、ゴルーチンは非常に軽量で、Go ランタイムによって管理されます。ゴルーチンは、go
キーワードを使用して作成できます。
go func() { // 异步任务 }
channel
Channel は、Go 言語がゴルーチン間で通信するために使用するパイプです。チャネルはデータの送受信に使用できます。
ch := make(chan int) // 创建一个无缓冲 channel // 向 channel 发送数据 ch <- 42 // 从 channel 接收数据 x := <-ch
実際的なケース: 同時 Web リクエスト
次に、非同期同時 Web リクエストの実際的なケースを示します。
package main import ( "fmt" "net/http" "time" ) func main() { // 创建一个 channel 来接收请求响应 results := make(chan string) // 发送并发请求 for i := 0; i < 10; i++ { go func(i int) { // 发送 HTTP GET 请求 resp, err := http.Get(fmt.Sprintf("https://example.com/%d", i)) if err != nil { results <- fmt.Sprintf("Error: %v", err) return } // 接收响应并发送结果 body, err := ioutil.ReadAll(resp.Body) if err != nil { results <- fmt.Sprintf("Error: %v", err) return } results <- fmt.Sprintf("Response: %s", string(body)) }(i) } // 接收并发请求的响应 for j := 0; j < 10; j++ { fmt.Println(<-results) } }
このプログラムは、次のチャネルを作成します。リクエストの応答を受信し、10 個のゴルーチンを開始して HTTP GET リクエストを同時に送信します。各ゴルーチンは、応答を受信した後、結果をチャネルに送信します。メインスレッドはチャネルから結果を受信し、コンソールに出力します。
このプログラムは、非同期プログラミングを通じて、メインスレッドをブロックすることなくリクエストを同時に処理できるため、アプリケーションのパフォーマンスと応答性が向上します。
以上がgolang関数の非同期プログラミング実習の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。