目次
3.コンテキストでタイムアウトの設定
4. HTTPハンドラーでコンテキストを使用します
ホームページ バックエンド開発 Golang キャンセルとタイムアウトのためにGOでコンテキストパッケージを使用する

キャンセルとタイムアウトのためにGOでコンテキストパッケージを使用する

Jul 29, 2025 am 04:08 AM
go

コンテキストを使用して、ゴロウチン全体のキャンセルと締め切りを伝播し、HTTPサーバー、バックグラウンドタスク、チェーンコールでの協力的キャンセルを可能にします。 2。Context.WithCancel()を使用して、キャンセル可能なコンテキストを作成し、Cancel()を呼び出して終了を信号し、常にcancel()を延期してリークを防ぎます。 3.タイムアウトの場合、context.withtimeout()を使用して操作期間を制限し、ctx.done()またはctx.err()をチェックして締め切りを処理します。 4。HTTPハンドラーでは、リクエストコンテキストをタイムアウトで拡張し、下流に渡し、バックエンド操作にクライアントリクエストのライフサイクルを尊重します。 5.ベストプラクティスには、常にCancel()を呼び出し、コンテキストを最初のパラメーターとして通過させること、構造体のコンテキストストレージの回避、時間の経過とともにTimeOutを好む。 6. CANCEL()を呼び出すのを忘れたり、CTX.ERR()を無視したり、非リケストデータのコンテキストの過剰使用などの一般的な落とし穴を避けてください。適切なコンテキストの使用により、キャンセル可能な操作が明示的に管理され、リソースが効率的にリリースされる回復力のある応答性のあるGOアプリケーションが保証されます。

キャンセルとタイムアウトのためにGOでコンテキストパッケージを使用する

GOに同時アプリケーションを構築する場合、キャンセルとタイムアウトの優雅に処理することが不可欠です。 contextパッケージは、リクエストスコープされた値、キャンセル信号、およびゴルチン全体の締め切りを管理するためのクリーンで効率的な方法を提供します。 HTTPサーバー、バックグラウンドタスク、およびチェーン機能呼び出しを備えたシステムで特に役立ちます。

キャンセルとタイムアウトのためにGOでコンテキストパッケージを使用する

キャンセルとタイムアウトのためにcontextパッケージを効果的に使用する方法は次のとおりです。


1.なぜコンテキストを使用するのですか?

コンテキストがなければ、ランニングゴルウチンに停止するように指示するのは困難です。特に、I/Oでブロックされている場合、または遅い依存関係を待っている場合です。 context.Contextタイプを使用すると、コールスタックを介してキャンセルシグナルと締め切りを伝播し、協力的なキャンセルを可能にします。

キャンセルとタイムアウトのためにGOでコンテキストパッケージを使用する

一般的なユースケース:

  • クライアントが切断された場合、HTTP要求をキャンセルします。
  • データベースクエリのタイミング。
  • サービスが停止したときにバックグラウンドワーカーを停止します。

2。コンテキストによる基本的なキャンセル

ゴルチンをキャンセルするには、 context.WithCancel()を使用してください。

キャンセルとタイムアウトのためにGOでコンテキストパッケージを使用する
パッケージメイン

輸入 (
    "コンテクスト"
    「FMT」
    "時間"
))

func main(){
    ctx、cancel:= context.withcancel(context.background())
    defer cancel()//キャンセルが呼び出されるようにリソースをリリースするように呼び出されます

    go func(ctx context.context){
        のために {
            select {
            ケース<-ctx.done():
                fmt.println( "労働者キャンセル:"、ctx.err())
                戻る
            デフォルト:
                fmt.println( "working ...")
                time.sleep(500 * time.millisecond)
            }
        }
    }(ctx)

    //作業を2秒間シミュレートします
    time.sleep(2 * time.second)
    cancel()//信号キャンセル

    time.sleep(1 * time.second)//クリーンアップの仕上げをします
}

キーポイント:

  • context.WithCancel()派生コンテキストとcancel関数を返します。
  • cancel()を呼び出すと、 Done()チャネルが閉じます。
  • 早期キャンセルを期待していなくても、メモリリークを避けるために、常にcancel()に電話してください。

3.コンテキストでタイムアウトの設定

context.WithTimeout()を使用して、操作がどれだけ時間をかけるかを制限する場合は、

 ctx、cancel:= context.withtimeout(context.background()、3*time.second)
defer cancel()

resultchan:= make(chan string、1)
go func(){
    //遅い操作をシミュレートします
    time.sleep(5 * time.second)
    resultchan < - 「操作完全」
}()

select {
ケースRES:= <-Resultchan:
    fmt.println(res)
ケース<-ctx.done():
    fmt.println( "操作タイミング:"、ctx.err())
}

出力:

タイミングの操作:コンテキストの締め切りが超えました
  • ctx.Err() context.DeadlineExceededがタイムアウトに達したときに成功しました。
  • ゴルウチンが走り続けていても、主なロジックは待機を停止します。

4. HTTPハンドラーでコンテキストを使用します

Webサーバーでは、着信要求にはすでにコンテキストがあります。タイムアウトで拡張するか、ダウンストリームサービスに渡すことができます。

 funcハンドラー(w http.responsewriter、r *http.request){
    //リクエストコンテキストに2秒のタイムアウトを追加します
    ctx、cancel:= context.withtimeout(r.context()、2*time.second)
    defer cancel()

    結果:= slowdatabasecall(ctx)
    ctx.err()== context.deadlineex cuceeded {
        http.Error(w、 "request qietimed"、http.statusgatewaytimeout)
        戻る
    }

    w.write([] byte( "result:" result))
}

func slowdatabasecall(ctx context.context)string {
    select {
    ケース<-time.after(3 * time.second):
        「データ」を返す
    ケース<-ctx.done():
        "//を返します。またはログキャンセル
    }
}
  • r.Context()は、クライアントが接続を閉じると自動的にキャンセルされます。
  • タイムアウトを追加すると、バックエンドが無期限にハングしないようにします。

5。ベストプラクティス

  • 常にcancel()defer cancel()を使用してリソースをリリースします。
  • APIを介してコンテキストを伝播しますcontext.Contextを受け入れる機能の最初のパラメーターとしてブロックされる可能性のある関数として。
  • コンテキストを構造体に保存しないでください:議論として明示的に渡します。
  • context.WithTimeouttime.After
  • ルートコンテキストにはcontext.Background()を使用しcontext.TODO()まだわからない場合は使用してください。

6。一般的な落とし穴

  • cancel() →リークゴルチンとメモリを呼び出すのを忘れる
  • ctx.Err() →ミスキャンセル信号を無視します
  • 必要ない値に対してコンテキストを使用してください→非クエストデータの過剰使用(たとえば、config)は、読みやすさを傷つける可能性があります。

contextパッケージを使用すると、GOプログラムがより回復力が高く応答性が高くなります。ユーザーのリクエスト、マイクロサービス、またはバックグラウンドジョブを扱うかどうかにかかわらず、コンテキストは、生涯を管理し、無駄な作業を避けるための標準的な方法を提供します。

基本的に、関数をキャンセルまたはタイムアウトする必要がある場合は、コンテキストを取る必要があります。

以上がキャンセルとタイムアウトのためにGOでコンテキストパッケージを使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

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

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

ホットトピック

Golangの環境変数をどのように操作しますか? Golangの環境変数をどのように操作しますか? Aug 19, 2025 pm 02:06 PM

goprovides-built-built-insupportfor handlingenvironmentvariablesviatheospackage、developerstoread、set、andmanageenvironmentdatasecurelylelyandyly.toreadavariable、useos.getenv( "key")、whoreturnsenemptringtringifthesnoteset、lo

GOでカスタムエラータイプを作成および使用する方法 GOでカスタムエラータイプを作成および使用する方法 Aug 11, 2025 pm 11:08 PM

GOでは、カスタムエラータイプを作成して使用すると、エラー処理の表現力とデブガブルが向上します。答えは、エラー()メソッドを実装する構造を定義することにより、カスタムエラーを作成することです。たとえば、ValidationErrorにはフィールドとメッセージフィールドが含まれ、フォーマットされたエラー情報を返します。次に、関数でエラーを返すことができ、異なるロジックを実行するために、タイプアサーションまたはエラーを使用して特定のエラータイプを検出できます。また、構造化されたデータ、差別化処理、ライブラリエクスポート、またはAPI統合を必要とするシナリオに適したカスタムエラーに適したカスタムエラーなどの行動方法を追加することもできます。単純な場合、error.new、およびerrnotfoundなどの事前定義されたエラーを使用して、比較可能にすることができます

GOでジェネリックLRUキャッシュを実装する方法 GOでジェネリックLRUキャッシュを実装する方法 Aug 18, 2025 am 08:31 AM

Go GenericsとContainer/Listを使用して、スレッドセーフLRUキャッシュを実現します。 2。コアコンポーネントには、マップ、双方向リンクリスト、ミューテックスロックが含まれます。 3.操作を取得して追加し、O(1)の時間の複雑さを伴うロックを介して同時実行セキュリティを確保します。 4.キャッシュがいっぱいになると、最長の未使用のエントリが自動的に排除されます。 5。例では、容量が3のキャッシュが最も長く使用されていない「B」を正常に排除しました。この実装は、一般的で効率的でスケーラブルなものを完全にサポートします。

GOアプリケーションで信号をどのように処理しますか? GOアプリケーションで信号をどのように処理しますか? Aug 11, 2025 pm 08:01 PM

GOアプリケーションで信号を処理する正しい方法は、OS/信号パッケージを使用して信号を監視し、エレガントなシャットダウンを実行することです。 1.信号を使用して、sigint、sigterm、その他の信号をチャネルに送信します。 2。ゴルチンでメインサービスを実行し、待機信号をブロックします。 3.信号を受信した後、Context.WithTimeOutを介してタイムアウトを使用してエレガントなシャットダウンを実行します。 4.データベース接続の閉鎖やバックグラウンドゴルウチンの停止などのリソースをクリーンアップします。 5.信号を使用して、必要に応じてデフォルトの信号動作を復元して、プログラムをKubernetesおよびその他の環境で確実に終了できることを確認します。

Goでのクロスプラットフォームパス操作にPATH/FILEPATHを使用する方法 Goでのクロスプラットフォームパス操作にPATH/FILEPATHを使用する方法 Aug 08, 2025 pm 05:29 PM

usefilepath.join()tosafelyconstructpathswithcorrectos-specificseparators.2.usefilepath.clean()toremoveredundantelementslikelike ".." and "。"。3.usefilepath.split()toseparatedirectoryandfilecomponents.4.usefilepath.dir()

パフォーマンスの比較:Java vs. Go for Backend Services パフォーマンスの比較:Java vs. Go for Backend Services Aug 14, 2025 pm 03:32 PM

gutypivityOffersbetterruntimeperformanceは、特にfori/o-heavyservices、duetoits lightgoroutinesineficientscheduler、whilejava、canslowertart、canmatchgoincpu-boundtasptimization.2.gouseslessme

Goの関数をどのように定義し、呼び出しますか? Goの関数をどのように定義し、呼び出しますか? Aug 14, 2025 pm 06:22 PM

GOでは、機能の定義と呼び出し関数はFUNCキーワードを使用し、固定構文に従って、最初に回答を明確にします。関数定義には、名前、パラメータータイプ、リターンタイプ、関数本文を含め、呼び出し時に対応するパラメーターを渡す必要があります。 1. funcadd(a、bint)int {return b}などの関数を定義する場合、funcfunctionname(params)returnType {} syntaxを使用します。 2。funcdivide(a、bfloat64)(float64、bool){}などの複数の返品値をサポートします。 3。関数の呼び出しは、括弧付きの関数名を直接使用して、結果:= add(3,5)などのパラメーターを渡します。 4.複数の返品値は、変数によって受信できます。

GOアプリケーションでRSSと原子フィードを解析します GOアプリケーションでRSSと原子フィードを解析します Aug 18, 2025 am 02:40 AM

GoFeedライブラリを使用して、RSSとAtomFeedを簡単に解析します。まず、GogetGithub.com/mmcdole/gofeedを介してライブラリをインストールし、パーサーインスタンスを作成し、ParseurlまたはParseStringメソッドを呼び出して、リモートまたはローカルフィードを解析します。ライブラリは、フォーマットを自動的に認識し、統一されたフィード構造を返します。次に、タイトル、リンク、公開時間などの標準化されたフィールドを取得するために、feed.itemを繰り返します。また、HTTPクライアントのタイムアウトを設定し、解析エラーを処理し、キャッシュ最適化パフォーマンスを使用して、最終的にシンプルで効率的で信頼できる飼料解像度を実現することをお勧めします。

See all articles