factory
factory copied to clipboard
关闭风险
func newWorker() (w *worker) {
w = &worker{
params: make(chan interface{}),
}
go func(w *worker) {
for {
if w.process() {
break
}
atomic.StoreInt32(&w.isBusy, 0)
}
// 置为繁忙状态
atomic.StoreInt32(&w.isBusy, 1)
// 可能存在任务
select {
case params := <-w.params:
w.action(params)
default:
}
// 关闭任务通道
close(w.params)
}(w)
return
}
在退出的时候,你这边考虑了有可能有某个任务正在写入新的参数。但是在你的这段代码运行到select的时候,也有可能那边还没开始写入参数,导致你这边运行到了default然后就把通道关闭了,导致写入方出现异常。