小编典典

永远进入项目的主要goroutine睡眠状态?

go

有没有让maingoroutine永远睡眠的API ?

换句话说,我希望我的项目始终运行,除非停止它。


阅读 342

收藏
2020-07-02

共1个答案

小编典典

“睡眠”

您可以使用许多永久阻塞的构造,而不会“吃掉” CPU。

例如,select不带任何case(且不带default)的a:

select{}

或从没有人发送任何东西的渠道接收:

<-make(chan int)

或从nil频道接收也会永远阻止:

<-(chan int)(nil)

或在nil频道上发送也会永远被阻止:

(chan int)(nil) <- 0

或锁定已经锁定的sync.Mutex

mu := sync.Mutex{}
mu.Lock()
mu.Lock()

戒烟

如果您确实想提供一种退出方法,则可以通过一个简单的渠道来完成。提供一个quit频道,并从中接收。当您要退出时,请关闭quit通道,因为“
关闭的通道上的接收操作始终可以立即进行,在接收到任何先前发送的值之后,将产生元素类型的零值
”。

var quit = make(chan struct{})

func main() {
    // Startup code...

    // Then blocking (waiting for quit signal):
    <-quit
}

// And in another goroutine if you want to quit:
close(quit)

请注意,发出close(quit)可能会随时终止您的应用。引用规范:程序执行:

程序执行首先初始化主程序包,然后调用函数main。当该函数调用返回时,程序退出。 它不等待其他(非main)goroutine完成。

close(quit)被执行时,我们的最后一条语句main()的功能可以继续在该装置main够程可以返回,所以程序退出。

2020-07-02