首頁  >  文章  >  後端開發  >  Goroutine 過早進入睡眠狀態

Goroutine 過早進入睡眠狀態

PHPz
PHPz轉載
2024-02-09 11:30:311136瀏覽

Goroutine 过早进入睡眠状态

php小編香蕉在這裡為大家介紹一個常見的問題,即Goroutine過早進入睡眠狀態。在Go語言中使用Goroutine並發執行任務是非常有效率的,但有時候我們會遇到這樣的情況,即Goroutine在執行任務之前就進入了睡眠狀態,導致任務無法正常進行。本文將詳細解釋這個問題的原因,並提供解決方法,幫助大家更好地理解並使用Goroutine。

問題內容

程式碼:

package main

import (
    "fmt"
    "time"
)

func main() {
    link := make(chan bool)
    stop := make(chan bool)
    go a(link, stop)
    go b(link)
    <-stop
}

func a(link chan bool, stop chan bool) {
    for i := 0; i < 20; i++ {
        time.Sleep(1 * time.Second)
        link <- true
    }
    stop <- true
}

func b(link chan bool) {
    go func() {
        <-link
        fmt.Println("A")
    }()
    go func() {
        <-link
        fmt.Println("B")
    }()
}

這段程式碼沒有做任何特別的事情,我只是想理解通道和 goroutine。但出了點問題,協程在兩次循環和應用程式崩潰後進入休眠狀態。

讓我們分析一下它的作用 - 每隔一秒訊息發送到 link。函數 b 在兩個地方接收它,因此呼叫了 print a 和 b。所以基本上每一秒 a 和 b 都應該出現在控制台中。但由於我不知道的原因,它沒有發生,程式印出 a 和 b 一次,然後崩潰。 我可能對這個概念理解不夠(golang確實不直觀),所以我希望我能在這裡得到答案。

解決方法

只有當有 goroutine 從中接收資料時,傳送到無緩衝通道的通道才會成功。對於前兩次發送,有 goroutine 從 link 通道接收。但是它們收到一個值並終止,並且不再有任何 goroutine 從 link 接收,因此第三個發送到 link 的區塊。由於沒有其他 goroutine 運行,程式出現死鎖。

以上是Goroutine 過早進入睡眠狀態的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除