Golang - 按键覆盖范围映射

时间:2016-08-23 08:54:42

标签: go concurrency

我正在尝试通过密钥在地图中覆盖频道。 这是地图:

documentChansPerHost := make(map[string](chan Document))

这就是我想要的范围:

wg := sync.WaitGroup{}
documentsCountPerHost := make(map[string]int)

// Count documents per host
for _,document := range documents {
    documentsCountPerHost[document.Host]++
}

// Spawn routines for up to 5 times the number of different
for host,documentCount := range documentsCountPerHost {

    println("Spawning " + strconv.Itoa(HOST_CONCURRENCY_LIMIT) + " Routines for Host " + host + " for " + strconv.Itoa(documentCount) + " url(s)")

    for i := 0; i < HOST_CONCURRENCY_LIMIT; i++ {

        go func() {

            for document := range documentChansPerHost[host] {

                fmt.Println(document.Url)
                wg.Done()

            }
        }
    }
}

这就是我创建,添加和关闭(到)频道的方式

// Instantiate channels for documents per host
for host,_ := range documentsCountPerHost {
    documentChansPerHost[host] = make(chan Document, 20)
}

for _, document:= range documents {
    wg.Add(1)
    documentChansPerHost[document.Host] <- document
}

for _, documentChan := range documentChansPerHost {
    close(documentChan)
}

wg.Wait()

但由于某种原因,它没有输出我传递到频道的所有文件Urls,程序永远不会结束。我是以错误的方式使用频道映射还是在某处与并发和锁定有关?

0 个答案:

没有答案