golang中的多并发

我正在尝试将 PHP 的一个简单的同步位移植到 Go,但是我很难理解并发在通道方面是如何工作的。PHP 脚本请求获取媒体库部分的列表,然后请求获取每个部分中的项目。如果该部分是电视节目列表,那么它会请求每个节目获取所有季节,然后另一个请求获取每个季节内的剧集。


我已经尝试在 pidgeon-go 中编写我期望的工作,但我没有任何运气。我在网上尝试了各种频道指南,但通常以死锁警告告终。当前,此示例警告 item := <-ch 用作值,并且看起来不像在等待 goroutines 返回。有没有人知道我能做什么?


package main


import (

    "fmt"

    "time"

)


// Get all items for all sections

func 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 sections

func getSections() []string {


    return []string{"HD Movies", "Movies", "TV Shows"}


}


// Get items within the given section, note that some items may spawn sub-items

func 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 parent

func getSubItemsForItem(name string, ch chan string) {


    time.Sleep(1 * time.Second)


    ch <- name + ": S01E01"

    ch <- name + ": S01E02"


}


三国纷争
浏览 233回答 1
1回答

噜噜哒

首先,该代码无法编译,因为for item := <- ch应该是for item := range ch现在的问题是你要么必须关闭通道,要么在 goroutine 中永远运行你的循环。go func() {&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; item, ok := <-ch&nbsp; &nbsp; &nbsp; &nbsp; if !ok {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(item)&nbsp; &nbsp; &nbsp; &nbsp; items = append(items, item)&nbsp; &nbsp; }}()time.Sleep(time.Second)fmt.Println(items)playground
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go