首頁 >後端開發 >Golang >為什麼我的 Go 程式中的 Goroutine 沒有執行?

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

Patricia Arquette
Patricia Arquette原創
2024-11-02 18:46:02656瀏覽

Why Doesn't My Goroutine Execute in My Go Program?

Goroutine 執行異常

使用者遇到了一個令人困惑的情況,他們的 goroutine 無法在 Go 程式中執行。儘管使用匿名函數創建了一個 goroutine 並將訊息發送到主函數內的通道,但「輸入 goroutine...」的預期輸出並不存在。

檢查提供的程式碼表明該 goroutine 確實是建立並將指標傳遞給訊息通道。但問題出在程序後續的執行流程。

缺少同步

最關鍵的問題是main函數和goroutine之間沒有同步。程式在列印「Done!」後結束,沒有提供任何機制讓 goroutine 繼續運作。

Go 允許 goroutine 與主程式並發執行。但是,如果 main 函數在 goroutine 完成任務之前退出,則 goroutine 將提前終止。

可能的解決方案

要解決此問題,程式必須實現同步機制確保 main 函數等待 goroutine 完成。這可以透過多種方法來實現:

  • 等待通道: 建立另一個通道,等待與創建的 goroutine 數量相等的特定數量的消息。 main 函數可以阻塞在這個通道上,直到收到所有訊息,表示所有 goroutine 完成。
  • sync.WaitGroup: 使用sync.WaitGroup 來追蹤活動 goroutine 的數量並當每個 goroutine 完成時減少它。 main 函數可以呼叫 WaitGroup.Wait() 阻塞,直到計數為零,確保所有 goroutine 都完成。
  • Select 語句: 利用 select 語句等待兩個 goroutine 的輸入訊息通道和「完成」通道。當從訊息通道接收到訊息時,對其進行處理。當從“done”通道收到訊息時,關閉訊息通道並退出 goroutine。 main 函數可以向「done」通道傳送訊息,表示程式已完成。

進一步探索

Go 博客提供了一個優秀的了解Go 中並發的資源,可以在以下鏈接找到:[Go 博客:並發]( https://blog.golang.org/go-concurrency-patterns)。

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

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