ホームページ バックエンド開発 Golang Golang ネットワークリクエストの同時実行

Golang ネットワークリクエストの同時実行

May 10, 2023 am 11:21 AM

インターネットの発展に伴い、ネットワーク リクエストは非常に重要なリンクとなり、多くのアプリケーションはネットワーク リクエストを通じてデータを取得する必要があります。同時実行性が高いシナリオでは、ネットワーク要求の同時実行性が特に重要です。この記事では、Golang を使用してネットワーク リクエストを同時処理する方法を紹介します。

1. Golang の同時実行モデル

Golang は同時プログラミングをサポートする言語であり、その同時実行モデルは goroutine とチャネルに基づいています。

Goroutine は、プロセス内で複数の goroutine を同時に実行できる軽量のスレッドです。 golang では、 go キーワードを使用して goroutine を簡単に作成できます。例:

func test() {
    fmt.Println("hello, world!")
}

func main() {
    go test() // 创建一个goroutine
    fmt.Println("main")
}
ログイン後にコピー

上記のコードでは、テスト関数が goroutine に作成され、main 関数の実行と同時に実行されます。

チャネルは、ゴルーチン間でデータを渡すために使用できる通信メカニズムです。チャネルの作成と使用は非常に簡単です。次に例を示します。

ch := make(chan int)
go func() {
    ch <- 1 // 发送数据到通道
}()

x := <-ch // 从通道中读取数据
ログイン後にコピー

このコードでは、整数チャネル ch を作成し、匿名関数を使用して整数 1 を別のゴルーチンのチャネル ch に送信します。次に、メインゴルーチンのチャネル ch から整数が読み込まれます。

2. Golang ネットワーク リクエストの同時実行性

golang では、標準ライブラリの net/http パッケージが http プロトコルのサポートを提供します。このパッケージを使用すると、http リクエストを簡単に開始できます。例:

resp, err := http.Get("http://www.google.com")
ログイン後にコピー

このコードは、Google への http GET リクエストを開始し、応答を取得できます。ただし、複数の URL に対するリクエストを同時に開始する必要がある場合、各リクエストは前のリクエストが完了するまで待ってから開始する必要があるため、非効率的です。

この場合、同時処理に goroutine とチャネルを使用できます。例:

func main() {
    urls := []string{"http://www.google.com", "http://www.sina.com.cn", "http://www.baidu.com"}

    ch := make(chan string)
    for _, url := range urls {
        go func(u string) {
            resp, err := http.Get(u)
            if err != nil {
                ch <- fmt.Sprintf("error: %s", err)
                return
            }
            defer resp.Body.Close()

            ch <- fmt.Sprintf("url: %s, status: %s", u, resp.Status)
        }(url)
    }

    for range urls {
        fmt.Println(<-ch)
    }
}
ログイン後にコピー

上記のコードでは、各リクエスト結果に関する情報を受信するために文字列タイプのチャネル ch を作成しました。 for ループを使用して URL のリストを反復処理し、ゴルーチンを使用して各 URL に対して http GET リクエストを個別に作成します。

ゴルーチンでは、まずリクエストを開始し、リクエストが完了したらレスポンス本文を閉じます。次に、チャネル ch を使用して、要求された結果情報を送信します。外側の for ループは、チャネルから返された結果情報を受信し、それをコンソールに出力する役割を果たします。

ゴルーチンとチャネルを使用すると、複数のネットワーク リクエストを同時に開始して同時実行パフォーマンスを向上させることができます。

3. Golang ネットワーク リクエストのタイムアウト処理

同時にネットワークをリクエストする場合、ネットワークの異常や長いサーバー応答に直面して、タイムアウト メカニズムを使用してリクエストの時間範囲を制御する必要があります。回。

golang では、コンテキスト パッケージを使用してタイムアウト メカニズムを追加できます。例:

func main() {
    urls := []string{"http://www.google.com", "http://www.sina.com.cn", "http://www.baidu.com"}

    ch := make(chan string)
    ctx, cancel := context.WithTimeout(context.Background(), time.Second*2)
    defer cancel()
    
    for _, url := range urls {
        go func(ctx context.Context, u string) {
            req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil)
            if err != nil {
                ch <- fmt.Sprintf("error: %s", err)
                return
            }
            
            resp, err := http.DefaultClient.Do(req)
            if err != nil {
                ch <- fmt.Sprintf("error: %s", err)
                return
            }
            defer resp.Body.Close()

            ch <- fmt.Sprintf("url: %s, status: %s", u, resp.Status)
        }(ctx, url)
    }

    for range urls {
        fmt.Println(<-ch)
    }
}
ログイン後にコピー

上記のコードでは、コンテキスト パッケージの WithTimeout 関数を使用してタイムアウトを作成します。 2 秒。コンテキスト。次に、ゴルーチン内で http.NewRequestWithContext 関数を使用してコンテキスト付きの http リクエストが作成され、リクエストが送信されます。リクエスト プロセス中に、ctx.Done() チャネルを使用してタイムアウト信号をリッスンします。タイムアウト信号がトリガーされると、リクエストされた操作は中断されます。

コンテキスト パッケージのタイムアウト メカニズムを使用すると、ネットワーク リクエストの時間を制御し、リクエスト プロセス中に発生する可能性のある例外を処理できます。

4. 概要

この記事では、Golang の同時実行モデル、ネットワーク リクエストの同時処理に goroutine とチャネルを使用する方法、およびタイムアウト メカニズムを処理するコンテキスト パッケージの使用方法を紹介しました。ネットワークリクエストの数。

インターネット アプリケーションの一般的な操作として、ネットワーク リクエストはシステム パフォーマンスの向上に重大な影響を与えます。ネットワーク要求を同時に処理し、タイムアウト メカニズムを使用することにより、アプリケーションの同時実行パフォーマンスと安定性が向上し、ユーザー エクスペリエンスが向上します。

以上がGolang ネットワークリクエストの同時実行の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

この記事では、Goのパッケージインポートメカニズム:名前付きインポート(例:インポート "fmt&quot;)および空白のインポート(例:_&quot; fmt&quot;)について説明しています。 名前付きインポートはパッケージのコンテンツにアクセス可能になり、空白のインポートはtのみを実行します

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

この記事では、Webアプリケーションでのページ間データ転送のためのBeegoのnewflash()関数について説明します。 newflash()を使用して、コントローラー間で一時的なメッセージ(成功、エラー、警告)を表示し、セッションメカニズムを活用することに焦点を当てています。 リミア

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

この記事では、MySQLクエリの結果をGO structスライスに効率的に変換することを詳しく説明しています。 データベース/SQLのスキャン方法を使用して、手動で解析することを避けて強調しています。 DBタグとロブを使用した構造フィールドマッピングのベストプラクティス

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

この記事では、ユニットテストのためにGOのモックとスタブを作成することを示しています。 インターフェイスの使用を強調し、模擬実装の例を提供し、模擬フォーカスを維持し、アサーションライブラリを使用するなどのベストプラクティスについて説明します。 articl

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

この記事では、GENICSのGOのカスタムタイプの制約について説明します。 インターフェイスがジェネリック関数の最小タイプ要件をどのように定義するかを詳しく説明し、タイプの安全性とコードの再利用性を改善します。 この記事では、制限とベストプラクティスについても説明しています

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

この記事では、goで効率的なファイルの書き込みを詳しく説明し、os.writefile(小さなファイルに適している)とos.openfileおよびbuffered write(大規模ファイルに最適)と比較します。 延期エラー処理、Deferを使用し、特定のエラーをチェックすることを強調します。

Goでユニットテストをどのように書きますか? Goでユニットテストをどのように書きますか? Mar 21, 2025 pm 06:34 PM

この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

この記事では、トレースツールを使用してGOアプリケーションの実行フローを分析します。 手動および自動計装技術について説明し、Jaeger、Zipkin、Opentelemetryなどのツールを比較し、効果的なデータの視覚化を強調しています

See all articles