1 回答
TA贡献2065条经验 获得超13个赞
您通常可以使用共享的退出频道来执行此操作,并进行一些计数。
func (p *Player) writeToSocket(quit <-chan struct{})
defer func() {
p.closeEventChan <- true
}()
for {
select {
case <-quit:
return
case m := <-p.writeChan:
// Do stuff
// Case where writeChan is closed, but quit isn't
default:
return
}
}
}
func (p *Player) readFromSocket(quit <-chan struct{})
defer func() {
p.closeEventChan <- true
}()
for {
select {
case <-quit:
return
default:
// Do stuff
}
}
}
func (p *Player) EventLoop() {
l4g.Info("Starting player %s event loop", p)
quit := make(chan struct{})
go p.readFromSocket(quit)
go p.writeToSocket(quit)
//blocks until we receive an interrupt from the read channel
<-p.closeEventChan
close(quit)
// This is superfluous here, but in a different case
// you loop over the remaining number of workers using a NumWorkers variable
for i := 0; i < 1; i++ {
<-p.closeEventChan
}
p.cleanup() //nothing else to do so lets cleanup
}
这里的想法是:
所有工人在关闭时通过通道通知中央程序,然后返回。
所有工作人员在广播退出消息时返回(通过关闭)。
中央循环在第一个工人退出后关闭退出通道,然后等待其余的退出。
- 1 回答
- 0 关注
- 176 浏览
添加回答
举报