ホームページ >バックエンド開発 >Golang >Golang コルーチンのライフサイクルを制御するにはどうすればよいですか?

Golang コルーチンのライフサイクルを制御するにはどうすればよいですか?

WBOY
WBOYオリジナル
2024-05-31 18:05:001094ブラウズ

Go コルーチンのライフ サイクルの制御は、次の方法で行うことができます: コルーチンを作成する: go キーワードを使用して新しいタスクを開始します。コルーチンを終了する: すべてのコルーチンが完了するまで待ち、sync.WaitGroup を使用します。チャネル終了信号を使用します。コンテキスト context.Context を使用します。

如何控制 Golang 协程的生命周期?

Go コルーチンのライフサイクルを制御するにはどうすればよいですか?

Go 言語では、コルーチン (ゴルーチンとも呼ばれます) は、メインスレッドをブロックせずに特定のタスクを実行するために使用される軽量の同時実行本体です。コルーチンのライフサイクルを管理することは、堅牢で保守可能な並列コードを作成するために重要です。

コルーチンを作成する

go キーワードを使用してコルーチンを作成します。メインスレッドが実行を継続できるように、バックグラウンドで新しいタスクを開始します。 go 关键字创建协程。它在后台启动一个新的任务,使主线程可以继续执行。

go func() {
    // 执行任务
}

终止协程

无法直接终止协程,但有以下方法可以间接达到此目的:

等待所有协程完成

使用 sync.WaitGroup 同步任务完成:

import "sync"

var wg sync.WaitGroup

func main() {
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(i int) {
            // 执行任务
            wg.Done()
        }(i)
    }
    wg.Wait()
}

使用通道关闭信号

使用通道向协程发送"关闭"信号:

func main() {
    done := make(chan struct{})
    for i := 0; i < 5; i++ {
        go func(i int) {
            for {
                select {
                case <-done:
                    return // 协程停止
                default:
                    // 执行任务
                }
            }
        }(i)
    }
    close(done) // 向所有协程发送"关闭"信号
}

使用上下文

使用 context.Context

import "context"

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    for i := 0; i < 5; i++ {
        go func(i int) {
            for {
                select {
                case <-ctx.Done():
                    return // 协程停止
                default:
                    // 执行任务
                }
            }
        }(i)
    }
    cancel() // 取消上下文
}

コルーチンの終了

コルーチンを直接終了することはできませんが、この目的を間接的に達成するには次のメソッドがあります:

すべてのコルーチンが完了するまで待つ

sync.WaitGroupを使用します。 > 同期するタスク完了: 🎜
package main

import "fmt"
import "time"

func main() {
    // 使用信道告诉协程何时退出
    stop := make(chan struct{})

    // 创建 5 个协程
    for i := 0; i < 5; i++ {
        go func(i int) {
            for {
                // 检查是否已经收到退出信号
                select {
                case <-stop:
                    fmt.Printf("协程 %d 已退出\n", i)
                    return
                default:
                    fmt.Printf("协程 %d 正在运行\n", i)
                    time.Sleep(time.Second)
                }
            }
        }(i)
    }

    // 运行 5 秒,然后发送退出信号
    time.Sleep(time.Second * 5)
    close(stop)

    // 等待所有协程退出
    time.Sleep(time.Second * 1)
}

チャネル終了シグナルを使用

🎜チャネルを使用してコルーチンに「クローズ」シグナルを送信: 🎜rrreee

コンテキストを使用

🎜 context.Context を使用 コルーチンの実行を管理します。コンテキストがキャンセルされると、コルーチンも終了します: 🎜rrreee🎜実践的なケース🎜🎜 以下は、チャネル終了信号を使用する実践的なケースです:🎜rrreee

以上がGolang コルーチンのライフサイクルを制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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