Golang ネットワークリクエストの同時実行
インターネットの発展に伴い、ネットワーク リクエストは非常に重要なリンクとなり、多くのアプリケーションはネットワーク リクエストを通じてデータを取得する必要があります。同時実行性が高いシナリオでは、ネットワーク要求の同時実行性が特に重要です。この記事では、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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











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

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

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

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

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

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

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

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