首頁 >後端開發 >Golang >Go中如何控制Goroutines的執行順序?

Go中如何控制Goroutines的執行順序?

DDD
DDD原創
2024-12-29 18:55:10537瀏覽

How Can I Control the Order of Execution of Goroutines in Go?

Goroutine 執行順序不可預測

在提供的程式碼片段中,兩個 Goroutine 的執行順序是不確定的。輸出顯示第二個 goroutine 首先執行,儘管它是在第一個 goroutine 之後啟動的。這種行為是由於 Goroutine 的並發特性造成的,這意味著它們彼此獨立執行。

Goroutine 中的同步機制

控制Goroutine 執行的順序,可以使用Go提供的同步機制,如as:

Channels : 你可以使用通道來同步goroutine 的執行。通道是允許 goroutine 發送和接收資料的通訊通道。在下面的修改範例中,通道用於阻塞主 Goroutine,直到第一個 Goroutine 在第二個 Goroutine 啟動之前完成執行。

func main() {

    c := make(chan int)

    go sum([]int{1, 2, 3}, c)

    // Use the channel to block until it receives a send
    x := <-c
    fmt.Println(x)

    // Then execute the next routine
    go sum([]int{4, 5, 6}, c)

    x = <-c
    fmt.Println(x)
}

等待群組: 等待群組是另一種同步機制,讓您在等待多個 goroutine 完成執行後再繼續。在下面的例子中,使用了一個等待組來確保所有的goroutine在主goroutine退出之前都完成。

func sum(a []int, c chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Println("summing: ", a)
    total := 0
    for _, v := range a {
        total += v
    }
    // Send total to c
    c <- total
}

func main() {

    c := make(chan int)
    wg := new(sync.WaitGroup)

    // Concurrently call the concurrent calls to sum, allowing execution to continue to the range of the channel
    go func() {
        // Increment the wait group, and pass it to the sum func to decrement it when it is complete
        wg.Add(1)
        go sum([]int{1, 2, 3}, c, wg)
        // Wait for the above call to sum to complete
        wg.Wait()
        // And repeat...
        wg.Add(1)
        go sum([]int{4, 5, 6}, c, wg)
        wg.Wait()
        // All calls are complete, close the channel to allow the program to exit cleanly
        close(c)
    }()

    // Range of the channel
    for theSum := range c {
        x := theSum
        fmt.Println(x)
    }

}

透過使用這些同步機制,你可以控制goroutine的執行順序,並確保維持所需的操作順序。

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

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