我正在尝试将 PHP 的一个简单的同步位移植到 Go,但是我很难理解并发在通道方面是如何工作的。PHP 脚本请求获取媒体库部分的列表,然后请求获取每个部分中的项目。如果该部分是电视节目列表,那么它会请求每个节目获取所有季节,然后另一个请求获取每个季节内的剧集。我已经尝试在 pidgeon-go 中编写我期望的工作,但我没有任何运气。我在网上尝试了各种频道指南,但通常以死锁警告告终。当前,此示例警告 item := <-ch 用作值,并且看起来不像在等待 goroutines 返回。有没有人知道我能做什么?package mainimport ( "fmt" "time")// Get all items for all sectionsfunc main() { ch := make(chan string) sections := getSections() for _, section := range sections { go getItemsInSection(section, ch) } items := make([]string, 0) for item := <- ch { items = append(items, item) } fmt.Println(items)}// Return a list of the various library sectionsfunc getSections() []string { return []string{"HD Movies", "Movies", "TV Shows"}}// Get items within the given section, note that some items may spawn sub-itemsfunc getItemsInSection(name string, ch chan string) { time.Sleep(1 * time.Second) switch name { case "HD Movies": ch <- "Avatar" ch <- "Avengers" case "Movies": ch <- "Aliens" ch <- "Abyss" case "TV Shows": go getSubItemsForItem("24", ch) go getSubItemsForItem("Breaking Bad", ch) }}// Get sub-items for a given parentfunc getSubItemsForItem(name string, ch chan string) { time.Sleep(1 * time.Second) ch <- name + ": S01E01" ch <- name + ": S01E02"}
1 回答
噜噜哒
TA贡献1784条经验 获得超7个赞
首先,该代码无法编译,因为for item := <- ch应该是for item := range ch
现在的问题是你要么必须关闭通道,要么在 goroutine 中永远运行你的循环。
go func() {
for {
item, ok := <-ch
if !ok {
break
}
fmt.Println(item)
items = append(items, item)
}
}()
time.Sleep(time.Second)
fmt.Println(items)
playground
- 1 回答
- 0 关注
- 232 浏览
添加回答
举报
0/150
提交
取消