ホームページ >バックエンド開発 >Golang >golang関数の非同期プログラミング実習

golang関数の非同期プログラミング実習

王林
王林オリジナル
2024-04-28 21:27:02685ブラウズ

非同期プログラミングを使用すると、メインスレッドをブロックせずにタスクを実行できます。 Go 言語は、軽量のスレッド goroutine と通信パイプ チャネルを使用して、非同期プログラミングを実装します。ゴルーチンは go キーワードを使用して作成され、チャネルはゴルーチン間でデータを送受信するために使用されます。実際のケース: 同時 Web リクエストは、チャネルを使用してリクエスト応答を受信し、ゴルーチンを通じて HTTP GET リクエストを同時に送信します。メインスレッドはチャネルから応答を受信し、結果を出力することで、プログラムのパフォーマンスと応答性が向上します。

golang関数の非同期プログラミング実習

Go 言語関数の非同期プログラミングの実践

非同期プログラミングは、プログラマが複数のタスクを同時に実行できるようにする並列プログラミングのテクノロジです。メインスレッドをブロックします。 Go 言語では、goroutinechannel を使用して非同期プログラミングを簡単に実装できます。

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

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