我有以下设置:
func startsMain (){
go main ()
}
fun stopMain (){
//kill main
}
func main() {
//infinite loop
}
我正在创建黄瓜步骤,我需要能够启动和关闭应用程序。
答案 0 :(得分:4)
你可以使用cppSTL
和频道杀死无限循环!
select
很好的Go换掉了,不是吗?
现在,这个奇怪的var quit chan struct{}
func startLoop() {
quit := make(chan struct{})
go loop()
}
func stopLoop() {
// As mentioned by Kaedys
//close(quit)
// permits signalling everyone havins such a `case <-quit:`
// statement to be stopped at once, which might be even better.
quit <- struct{}{}
}
// BTW, you cannot call your function main, it is reserved
func loop() {
for {
select {
case <-quit:
break
default:
// do stuff. I'd call a function, for clarity:
do_stuff()
}
}
}
是什么?这是一个零大小的频道。我们只能用空结构填充它(即:chan struct{}
)。它可以是struct{}{}
或其他任何内容,因为我们不会使用频道的内容。重要的是我们使用chan bool
通道来通知我们的goroutine中的无限循环,是时候停止了。
quit
语句用于捕获通道中的内容。这是一个阻塞语句(除非你输入select
语句,否则将暂停执行,直到某个被case
调查的通道中的某些内容放入其中。在这种情况下,每次执行default
时,如果在select
内放置了某些内容,则循环将中断,或者将调用quit
。如果您已通过Go Tour,那么您已经知道了这一点。
其他很酷的并发模式可以在Go Blog上找到。
最后,为了获得更多乐趣,您可以使用do_stuff()
来定期执行do_stuff
函数,而不是消耗100%CPU,如下所示:
Ticker
此处import "time"
// [...]
func loop() {
// This ticker will put something in its channel every 2s
ticker := time.NewTicker(2 * time.Second)
// If you don't stop it, the ticker will cause memory leaks
defer ticker.Stop()
for {
select {
case <-quit:
return
case <-ticker.C:
// do stuff. I'd call a function, for clarity:
do_stuff()
}
}
}
阻止了,因为我们删除了select
语句。