VideoClearExcutor函数无法理解

来源:5-5 task示例的实现

阿斯蒂芬潍坊

2019-08-05

func VideoClearExecutor(dc dataChan) error {
	errMap := &sync.Map{}
	var err error

FORLOOP:
	for {
		select {
		case vid := <-dc:
			go func(id interface{}) {
				if err := deleteVideo(id.(string)); err != nil {
					errMap.Store(id, err)
					return
				}

				if err := dbops.DelVideoDeletionRecord(id.(string)); err != nil {
					errMap.Store(id, err)
					return
				}
			}(vid)
		default:
			break FORLOOP
		}
	}

	errMap.Range(func(k, v interface{}) bool {
		err = v.(error)
		if err != nil {
			return false
		}
		return true
	})

	return err
}

老师,这段代码不是很理解
在case vid := <- dc: 这里,主程序起了一个goroutine去执行删除操作,之后主线程可以继续往下执行,这样有没有可能存在goroutine的删除操作还没执行完,主程序就跳出for循环,从而导致没有拿到全部的error的错误。
这里主程序好像没有等goroutine都执行完再跳出循环的操作

写回答

2回答

慕田峪7198936

2020-01-05

同学这里怎么解决的呢

0
0

艾文西

2019-08-11

这里应该是缺了个同步

0
2
慕瓜2466355
dc通道关闭后 case vid := <-dc:语句还是能走的吧,所以default应该是永远不会执行到的吧
2020-05-09
共2条回复

Go语言实战流媒体视频网站,高效学习Go高性能开发

从零开始,全面掌握Go语言编码的架构风格和开发Web的关键技能

996 学习 · 268 问题

查看课程