Go编程技巧--Goroutine的优雅控制
|
原文:Go编程技巧--Goroutine的优雅控制
通常
对于情况1,只需要关闭对应的描述符,阻塞的 重点讨论情况2。并发编程, 如果在整个应用程序的生命周期里,writer和reader都表现为一个 我们先看reader。我们首先可以想到,利用 type routineSignal struct {
done <-chan struct{}
}
func (r *reader)init(s *routineSignal) {
r.signal = s
}
在reader的循环中,就可以这么写: func (r *reader)loop() {
for {
select {
case <-r.signal.done:
return
case <-r.queue:
....
}
}
}
当需要终止 close(signal.done) 看起来很完备了,这可以处理大部分的情况了。这样做有个弊端,尽管,我们可以期望 type routineSignal struct {
done chan struct{}
wg sync.WaitGroup
}
增加一个sync.WaitGroup的实例,在 func (r *reader)loop() {
r.signal.wg.Add(1)
defer r.signal.wg.Done()
for {
select {
case <-r.signal.done:
return
case <-r.queue:
....
}
}
}
外部,只需要等待 close(signal.done) signal.wg.Wait() 只要 推导一下,不难发现,对于writer也可以采用这种方法。于是,总结一下,我们创建了一个叫 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
