首頁 > 後端開發 > Golang > 主體

golang函數如何控制goroutine的執行?

PHPz
發布: 2024-05-04 12:39:01
原創
936 人瀏覽過

Go 函數控制 Goroutine 執行有以下方法:runtime.Goexit():強制終止目前 Goroutine。 sync.WaitGroup: 等待一組 Goroutines 完成。 select{}:允許 Goroutine 等待多個事件之一併根據第一個觸發的事件執行相應操作。 context.Context: 可以用來向 Goroutine 傳遞截止日期或取消請求。

golang函數如何控制goroutine的執行?

Go 函數如何控制Goroutine 的執行

Go 程式語言支援並發,並使用Goroutine(輕量級執行緒)實現並行. Goroutine 可以透過函數創建,並在創建後的任何時間啟動。本文將介紹用於控制 Goroutine 執行的不同函數,並提供一些實戰案例。

控制 Goroutine 執行的函數

  • #runtime.Goexit():強行終止目前 Goroutine。
  • sync.WaitGroup: 等待一組 Goroutines 完成。
  • select{}:允許 Goroutine 等待多個事件之一併根據第一個觸發的事件執行對應操作。
  • context.Context: 可以用來傳遞截止日期給 Goroutine 截止日期或取消請求。

實戰案例

1. 終止Goroutine

package main

import (
    "fmt"
    "runtime"
    "time"
)

func main() {
    go func() {
        for {
            fmt.Println("Goroutine is running...")
            time.Sleep(1 * time.Second)
        }
    }()

    // 等待 10 秒后终止 Goroutine
    time.Sleep(10 * time.Second)
    runtime.Goexit()
}
登入後複製

2. 使用sync.WaitGroup 等待Goroutine

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    // 创建 5 个 Goroutine
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(i int) {
            fmt.Printf("Goroutine %d is running...\n", i)
            time.Sleep(1 * time.Second)
            wg.Done()
        }(i)
    }

    // 等待所有 Goroutine 完成
    wg.Wait()
}
登入後複製

3. 使用select{} 回應事件

package main

import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("Waiting for events...")

    // 创建两个 channel
    ch1 := make(chan string)
    ch2 := make(chan string)

    // 创建两个 Goroutine 向 channel 发送数据
    go func() {
        time.Sleep(1 * time.Second)
        ch1 <- "Event from Channel 1"
    }()
    go func() {
        time.Sleep(2 * time.Second)
        ch2 <- "Event from Channel 2"
    }()

    for {
        select {
            case msg := <-ch1:
                fmt.Println(msg)
                return
            case msg := <-ch2:
                fmt.Println(msg)
                return
        }
    }
}
登入後複製

4. 使用context.Context 取消Goroutine

package main

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

func main() {
    // 创建一个 context
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()

    // 创建一个 Goroutine
    go func() {
        for {
            select {
                case <-ctx.Done():
                    fmt.Println("Goroutine cancelled")
                    return
                default:
                    fmt.Println("Goroutine is running...")
                    time.Sleep(1 * time.Second)
            }
        }
    }()

    // 等待 15 秒后取消 Goroutine
    time.Sleep(15 * time.Second)
    cancel()
}
登入後複製

以上是golang函數如何控制goroutine的執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!