为了账号安全,请及时绑定邮箱和手机立即绑定

golang中的多并发

golang中的多并发

Go
三国纷争 2021-08-10 15:58:15
我正在尝试将 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


查看完整回答
反对 回复 2021-08-10
  • 1 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信