当前位置:  开发笔记 > 编程语言 > 正文

所有的例程都睡着了 - 僵局

如何解决《所有的例程都睡着了-僵局》经验,为你挑选了1个好方法。

我不明白为什么在这段代码中发生了死锁.我尝试了几种不同的东西来阻止僵局(使用WorkGroup的几个不同版本).这是我在Go的第一天,到目前为止我对相当简单和直接的操作的复杂性感到非常失望.我觉得我错过了一些大而明显的东西,但是我发现的所有文档看起来都非常不同于我,这是一种非常基本的操作模式.所有文档都使用基本类型的通道(int,string)而不是更复杂的类型,所有类型都具有非常基本的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")
}

JimB.. 6

你永远不会关闭"卡车"频道ch,所以UnloadTrucks永远不会回来.

完成所有工作后,您可以使用WaitGroup关闭通道:

go func() {
    wg.Wait()
    close(ch)
}()
UnloadTrucks(ch)

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



1> JimB..:

你永远不会关闭"卡车"频道ch,所以UnloadTrucks永远不会回来.

完成所有工作后,您可以使用WaitGroup关闭通道:

go func() {
    wg.Wait()
    close(ch)
}()
UnloadTrucks(ch)

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

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有