作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我不明白为什么这段代码会出现死锁。我已经尝试了几种不同的方法来阻止死锁(使用 WorkGroup 的几个不同版本)。这是我在 Go 的第一天,到目前为止,我对相当简单和直接的操作的复杂性感到非常失望。我觉得我遗漏了一些大而明显的东西,但我在这方面找到的所有文档似乎与对我来说非常基本的操作模式截然不同。所有文档都使用 channel 的原始类型(int、字符串)而不是更复杂的类型,所有这些都具有非常基本的 for 循环,或者它们位于范围的另一端,其中函数是相当复杂的编排。
我想我真的在寻找 goroutines 的“这通常是如何完成的”的中间示例。
package main
import "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")
}
最佳答案
您永远不会关闭“卡车” channel ch
,因此 UnloadTrucks
永远不会返回。
您可以在所有工作人员完成后关闭 channel ,方法是使用 WaitGroup:
go func() {
wg.Wait()
close(ch)
}()
UnloadTrucks(ch)
关于go - 所有 go routines 都睡着了 - 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42093495/
我是一名优秀的程序员,十分优秀!