亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 goroutine 時出現死鎖

使用 goroutine 時出現死鎖

Go
慕無忌1623718 2023-02-14 18:02:14
我有一個程序可以做兩件事:讀取日志條目并創建logEntry對象處理每個logEntry實例在這里,讀取由單獨的 goroutine 完成,所有讀取條目的處理由單個 goroutine 完成。我正在使用等待組——wg確保在程序退出之前讀取所有日志條目,并使用信號通道——done確保日志條目的處理完成。等待組按預期工作,但是當我調用<-done以確保程序僅在處理讀取的日志文件后退出時,它會拋出錯誤fatal error: all goroutines are asleep - deadlock!。有人可以解釋為什么會發生這種情況以及如何解決上述錯誤嗎?
查看完整描述

1 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

在你的情況下,你正在聽linesChan,但沒有關閉它。當所有數據都通過時,您需要關閉此通道。done <- true不會被執行。


但是這里不需要同步頻道,sync.WaitGroup{}就足夠了。


package main


import (

    "fmt"

    "sync"

    "time"

)


type logEntry struct {

    lines      []string

    created_at string

    line_count int

}


var wg sync.WaitGroup


func main() {

    linesChan := make(chan (logEntry))


    // Process entries from lines

    go func() {

        for c := range linesChan {

            time.Sleep(100 * time.Millisecond)

            fmt.Printf("%v\n", c)

        }

    }()


    // Read lines

    for i := 1; i <= 10; i++ {

        wg.Add(1)

        go func(i int, linesChan chan (logEntry)) {

            read(i, linesChan)

        }(i, linesChan)

    }


    // Wait till all the files are read

    wg.Wait()

}


func read(count int, channel chan (logEntry)) {

    fmt.Println(count, "read")

    channel <- logEntry{

        line_count: count,

    }

    wg.Done()

}


查看完整回答
反對 回復 2023-02-14
  • 1 回答
  • 0 關注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號