1 回答

TA貢獻1839條經(jīng)驗 獲得超15個贊
收到退出時,輸出通道可以包含值。通過制作無緩沖通道進行修復:
out := make(chan []byte)
這可確保在退出之前收到從工作線程發(fā)送的值:
在無緩沖信道上發(fā)送/接收發(fā)生在調(diào)用
wg.Done()
所有電話在返回之前發(fā)生
wg.Done()
wg.Wait()
wg.Wait()
在將值發(fā)送到 之前返回quit
因此,在將值發(fā)送到 之前,將從 接收值。out
quit
另一種方法是關(guān)閉通道,向結(jié)果收集器發(fā)出工作線程已完成的信號: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 關(guān)注
- 105 瀏覽
添加回答
舉報