首頁  >  文章  >  後端開發  >  如何控制 Golang 協程的生命週期?

如何控制 Golang 協程的生命週期?

WBOY
WBOY原創
2024-05-31 18:05:001027瀏覽

控制 Go 協程的生命週期可以透過以下方式:建立協程:使用 go 關鍵字啟動新任務。終止協程:等待所有協程完成,使用 sync.WaitGroup。使用通道關閉訊號。使用上下文 context.Context。

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

如何控制 Go 協程的生命週期?

Go 語言中,協程(又稱 Goroutine)是輕量的並發執行體,用於執行特定的任務,而不會阻塞主執行緒。管理協程的生命週期對於編寫健全和可維護的平行程式碼至關重要。

建立協程

使用 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() // 取消上下文
}

實戰案例

以下是一個使用通道關閉訊號的實戰案例:

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)
}

以上是如何控制 Golang 協程的生命週期?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn