1 回答
TA贡献1839条经验 获得超15个赞
收到退出时,输出通道可以包含值。通过制作无缓冲通道进行修复:
out := make(chan []byte)
这可确保在退出之前收到从工作线程发送的值:
在无缓冲信道上发送/接收发生在调用
wg.Done()
所有电话在返回之前发生
wg.Done()
wg.Wait()
wg.Wait()
在将值发送到 之前返回quit
因此,在将值发送到 之前,将从 接收值。out
quit
另一种方法是关闭通道,向结果收集器发出工作线程已完成的信号:out
func getContents(fileNames []string) ([][]byte, error) {
wg := sync.WaitGroup{}
var responseBytes [][]byte
out := make(chan []byte)
var opsFileRead uint64
var opsChannelGot uint64
for _, fileName := range fileNames {
wg.Add(1)
go func(fName string, out chan []byte, wg *sync.WaitGroup) {
defer wg.Done()
data, err := ioutil.ReadFile(fName)
if err != nil {
log.Fatal(err)
}
out <- data
atomic.AddUint64(&opsFileRead, 1)
}(fileName, out, &wg)
}
// Close out after workers are done.
go func() {
wg.Wait()
close(out)
}()
// Loop over outputs until done.
for bts := range out {
if len(bts) > 0 {
atomic.AddUint64(&opsChannelGot, 1)
responseBytes = append(responseBytes, bts)
}
}
fmt.Printf("I quit, i read %d, i got %d\n", opsFileRead, opsChannelGot)
return responseBytes, nil
}
- 1 回答
- 0 关注
- 81 浏览
添加回答
举报