ホームページ >バックエンド開発 >Golang >golang が Ctrip を閉じる

golang が Ctrip を閉じる

PHPz
PHPzオリジナル
2023-05-13 10:05:07931ブラウズ

近年、Go 言語は、高同時実行性および大規模データ アプリケーションの分野で非常に人気のあるプログラミング言語となっています。その中でも、Go 言語ではコルーチン (Go ルーチンとも呼ばれます) が非常に重要な概念であり、同時プログラミングに非常に役立ちます。

コルーチンは軽量スレッドとみなすことができ、オペレーティング システムによるカーネル レベルのスレッド スケジューリングを必要としませんが、Go 言語のランタイム環境によってスケジュールされます。したがって、コルーチンの作成と破棄は比較的高速であり、非常に効率的な同時処理をサポートできます。

しかし、実際のアプリケーションでは、実行中のコルーチンを終了する必要があることが多く、その際にいくつかの問題が発生するため、この記事ではこれらの問題を詳しく分析します。

コルーチンを閉じる問題

コルーチンを閉じるのは簡単ではありません。これは、Go 言語では、コルーチンは Go 言語の実行環境によってスケジュールされ、実行順序や実行状態は実行環境自体によって決定されるためです。コルーチンをシャットダウンしたい場合、外部の力によってその実行を直接停止することは困難です。

Go 言語の実行環境には、現在のコルーチンの実行を停止する runtime.Goexit() 関数が用意されていますが、停止できるのは現在のコルーチンのみで、他のコルーチンを停止することはできません。

では、実行中のコルーチンを閉じるにはどうすればよいでしょうか?現時点では、次の問題を考慮する必要があります。

  1. コルーチンに自身を停止するように通知する方法

場合によっては、コルーチンには、停止する必要があるかどうかを示すフラグが設定されており、特定の条件下では、このフラグを設定することでコルーチン自体を停止するように通知できます。

ただし、この方法は自己停止できるコルーチンに対してのみ機能します。自身を停止できないコルーチンについては、他のメソッドを使用してそれらを閉じる必要があります。

  1. コルーチンの完了を待つ方法

コルーチンを自分で停止できない場合は、完了するまで待つ必要があります。閉じる前の作業。現時点では、コルーチンの完了を待つための信頼できる方法が必要です。

Go 言語では、WaitGroup を使用してコルーチンの完了を待つことができます。 WaitGroup は Go 言語の同時実行プリミティブで、コルーチンのグループの完了を待つために使用できます。

  1. 安全に閉じる方法

コルーチンを閉じるときは、シャットダウンの安全性を確保する必要があります。これは、コルーチンを閉じる前に完全にクリーンアップしないと、メモリ リークやその他の望ましくない結果が発生する可能性があるためです。

Go 言語では、defer ステートメントを使用してクリーンアップ作業を実行し、コルーチンが閉じる前に必要なクリーンアップ作業をすべて完了していることを確認できます。

Go 言語でコルーチンを閉じる問題を理解した後、Go 言語でコルーチンを閉じる方法を見てみましょう。以下にいくつかの方法を示します。

方法 1: シグナル通知を使用する

Go 言語では、

channel

を使用してコルーチン間の通信を実現できます。特定の channel にシグナルを送信することで、コルーチン自体を停止させることができます。 以下はサンプル コードです:

package main

import (
    "fmt"
    "time"
)

func worker(done chan bool) {
    fmt.Println("Worker: started")
    time.Sleep(time.Second)
    fmt.Println("Worker: done")
    done <- true
}

func main() {
    done := make(chan bool, 1)
    go worker(done)

    <-done
    fmt.Println("Main: done")
}

上記のサンプル コードでは、まず

worker

という名前のコルーチンを定義します。これは何らかの作業を実行し、シグナルを送信します。完了すると、done チャネルが表示されます。 main 関数では、done という名前のチャネルを作成し、それをコルーチンに渡します。

done

チャネルを待機している間、main 関数は、worker コルーチンが完了してシグナルを送信するまでブロックされます。シグナルが受信されると、main 関数は実行を継続し、Main:done を出力します。 方法 2:

context.Context

Go 言語では、

context

パッケージを使用してコルーチンのコンテキストを管理できます。 context.Context を使用すると、指定したコンテキストでコルーチンを開始し、コルーチンを停止する必要があるときにコンテキストをキャンセルして、コルーチンの実行を停止できます。 以下はサンプル コードです:

package main

import (
    "fmt"
    "time"
    "context"
)

func worker(ctx context.Context) {
    fmt.Println("Worker: started")
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Worker: done")
            return
        default:
            fmt.Println("Worker: working")
            time.Sleep(time.Second)
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)

    time.Sleep(3 * time.Second)
    cancel()

    fmt.Println("Main: done")
}

上記のサンプル コードでは、まずメイン ループで

worker

という名前のコルーチンを定義します。 を使用します。 select ステートメントを使用して、2 つのチャネル (ctx.Done() チャネルと default チャネル) をリッスンします。 ctx.Done() チャネルがシグナルを受信すると、コルーチンは終了します。

main

関数では、まず context.Context を作成し、 context.WithCancel 関数を使用してそれをコンテキストに追加します。次に、このコンテキストを worker コルーチンに渡します。一定期間実行した後、cancel 関数を呼び出してコンテキストをキャンセルし、worker コルーチンの実行を停止します。 <h2>概要</h2> <p>上記の 2 つの方法により、Go 言語でコルーチンを安全に閉じることができます。コルーチンを閉じるときは、コルーチン自体を停止できるかどうか、コルーチンの完了を待つ方法、およびコルーチンを安全に閉じる方法を考慮する必要があります。 <code>channelWaitGroupcontext などの Go 言語の同時実行プリミティブを適切に使用することで、効率的で安全かつ信頼性の高いコルーチンのシャットダウン操作を実現できます。

以上がgolang が Ctrip を閉じるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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