首頁  >  文章  >  後端開發  >  為什麼我的 Goroutine 在 Go 中沒有執行?

為什麼我的 Goroutine 在 Go 中沒有執行?

DDD
DDD原創
2024-11-02 09:59:30416瀏覽

Why is My Goroutine Not Executing in Go?

Goroutine 執行中斷:分析特定用例

在 Go 程式設計領域,goroutines 提供了一個強大的任務並發執行機制。然而,在某些情況下,goroutine 可能被創建但未被執行。最近在一個流行的問答平台上出現了一個這樣的場景,用戶遇到了 goroutine 執行的問題。

問題中提供的使用者程式碼定義了一個從通道讀取訊息的 goroutine:

<code class="go">go func(m *chan string) {
    fmt.Println("Entering the goroutine...")
    for {
        fmt.Println(<- *m)
    }
}(&messages)</code>

然而,控制台輸出保持沉默,goroutine 無法執行。用戶感到困惑,想知道為什麼“進入 goroutine”訊息從未被打印。

要理解這個問題,重要的是要記住 goroutine 在並發執行時並不直接依賴 main程式的執行流程。在這種情況下,使用者的 main 函數在列印「Done!」後立即結束,導致 goroutine 在有機會執行之前就被終止了。

解決方案在於引入一種機制來保存主程式直到 goroutine 完成其任務。這可以使用通道、sync.WaitGroup 或其他同步原語等技術來實現。

下面修改後的程式碼包含一個在繼續之前等待來自goroutine 的訊號的通道:

<code class="go">done := make(chan bool)

go func(m *chan string) {
    fmt.Println("Entering the goroutine...")
    for {
        fmt.Println(<- *m)
    }

    done <- true
}(&messages)

<-done</code>

在這段修改後的程式碼中,goroutine 一旦完成就會向「done 「通道發送一個訊號,主程式在退出之前等待這個訊號。結果,goroutine 能夠完全執行,產生預期的輸出。

透過了解 Goroutine 的非同步特性並利用同步技術,開發人員可以確保 Goroutine 有效執行並在內部實現其預期目的。 Go 的並發執行模型。

以上是為什麼我的 Goroutine 在 Go 中沒有執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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