ホームページ >バックエンド開発 >Golang >Golang cli アプリケーション - コンテキストを正しく使用するには?

Golang cli アプリケーション - コンテキストを正しく使用するには?

WBOY
WBOY転載
2024-02-09 10:42:20966ブラウズ

Golang cli 应用程序 - 如何正确使用上下文?

Golang cli アプリケーション - コンテキストを正しく使用するには? PHPエディターのYuzaiが、Golangのcliアプリケーションでコンテキストを正しく使用する方法を紹介します。 cli アプリケーションを開発する場合、コンテキストは非常に重要です。コンテキストは、アプリケーションの状態の管理、パラメーターやエラーの受け渡しなどに役立ちます。この記事では、コンテキストの概念を詳細に説明し、コンテキストをよりよく理解して適用するのに役立ついくつかの実際的な適用例を示します。初心者でも経験豊富な開発者でも、この記事は役に立ちます。 Golang cli アプリケーションのコンテキストを詳しく見てみましょう。

質問内容

私は golang を初めて使用するもので、コンテキストと golang アプリケーションでのコンテキストの使用方法について少し混乱しています。 具体的には、たとえば、mongo へのアクセスのみを必要とする cli アプリケーションを開発しています。

いいね - 単一の共有 ctx コンテキスト変数を作成し、それをコンテキストを必要とするアクションに使用するだけですが、これは正しいですか?

コンテキストを必要とする操作では、5 秒タイマーが再起動されますか?それとも共有タイマーなのでしょうか?

package main

import (
    "context"
    "log"
    "os"
    "time"

    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)

func main() {

    log.SetOutput(os.Stdout)

    // Create a context with a timeout of 5 seconds
    //This defines a timeout context that will be canceled after 5 seconds.
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    // always defer in case func returns early
    defer cancel()

    //Creates a new ClientOptions instance.
    clientOptions := options.Client()
    clientOptions = clientOptions.ApplyURI("mongodb+srv://127.0.0.1?retryWrites=true&w=majority")

    //Connect to mongo
    client, err := mongo.Connect(ctx, clientOptions)
    defer client.Disconnect(ctx)
    if err != nil {
        log.Fatal(err)
    }

    //Test connection to the database
    log.Println("I: test mongo connection using ping")
    err = client.Ping(ctx, readpref.Primary())
    if err != nil {
        log.Fatal(err)
    }

    log.Println("I: Fin")
}

回避策

考えてみると、context.context は「水平」に (同じコール スタックに属さない操作間での意味で) 共有できます。意味のない。 golang context は、通信遅延などによるハングを防ぐために、操作が実行されるコンテキスト (呼び出しスタック内でその下にネストされた操作を含む) を提供します。たとえば、「x 秒以内」などです。したがって、10 個のリクエストを並行して行う場合は、各リクエストに独自のコンテキストを与える必要があります。おそらく、最初のリクエストが失敗したために 10 番目のリクエストが失敗することは望ましくありません。 context.background() または context.todo() をさらに装飾せずに使用している場合は、最初に作成するときに context# を追加する必要はおそらくありません。 ## 変数に保存 - 呼び出しスタックの最初の関数に渡すことで作成時に作成できます。適切に構築されたコードは、必要に応じてスタックに渡し、途中で必要な装飾を適用します。 リーリー

dothingthatmaytakeawhile()

を複数回呼び出す場合、呼び出しごとに個別のサブコンテキストが必要です - を共有したくありません 呼び出しごとに ctx を実行します。 したがって、 コードでは、mongo.connect() p> への呼び出しごとに、新しく作成された

context.context インスタンスを受け取る必要があります。

以上がGolang cli アプリケーション - コンテキストを正しく使用するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。