第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

所有 go 例程都睡著了 - 死鎖

所有 go 例程都睡著了 - 死鎖

Go
拉丁的傳說 2021-11-29 19:42:49
我不明白為什么在這段代碼中會發(fā)生死鎖。我嘗試了幾種不同的方法來停止僵局(使用 WorkGroup 的幾個不同版本)。這是我在 Go 的第一天,到目前為止,我對相當(dāng)簡單直接的操作的復(fù)雜性感到非常失望。我覺得我錯過了一些大而明顯的東西,但是我在這方面找到的所有文檔似乎都與對我來說非?;镜牟僮髂J椒浅2煌K械奈臋n都使用原始類型的通道(int、string)而不是更復(fù)雜的類型,所有這些都帶有非?;镜?for 循環(huán),或者它們位于頻譜的另一端,其中函數(shù)是相當(dāng)復(fù)雜的編排。我想我真的在尋找使用 goroutines 的“這通常是如何完成的”的中間樣本。package mainimport "fmt"//import "sync"import "time"type Item struct {    name string}type Truck struct {    Cargo []Item    name  string}func UnloadTrucks(c chan Truck) {    for t := range c {        fmt.Printf("%s has %d items in cargo: %s\n", t.name, len(t.Cargo), t.Cargo[0].name)    }}func main() {    trucks := make([]Truck, 2)    ch := make(chan Truck)    for i, _ := range trucks {        trucks[i].name = fmt.Sprintf("Truck %d", i+1)        fmt.Printf("Building %s\n", trucks[i].name)    }    for t := range trucks {        go func(tr Truck) {            itm := Item{}            itm.name = "Groceries"            fmt.Printf("Loading %s\n", tr.name)            tr.Cargo = append(tr.Cargo, itm)            ch <- tr        }(trucks[t])    }    time.Sleep(50 * time.Millisecond)    fmt.Println("Unloading Trucks")    UnloadTrucks(ch)    fmt.Println("Done")}
查看完整描述

1 回答

?
翻翻過去那場雪

TA貢獻(xiàn)2065條經(jīng)驗 獲得超14個贊

你永遠(yuǎn)不會關(guān)閉“卡車”頻道ch,所以UnloadTrucks永遠(yuǎn)不會回來。


您可以在所有工作人員完成后關(guān)閉通道,使用 WaitGroup:


go func() {

    wg.Wait()

    close(ch)

}()

UnloadTrucks(ch)

http://play.golang.org/p/1V7UbYpsQr


查看完整回答
反對 回復(fù) 2021-11-29
  • 1 回答
  • 0 關(guān)注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號