gpt4 book ai didi

Go 项目的主要 goroutine 永远休眠?

转载 作者:IT老高 更新时间:2023-10-28 13:03:47 24 4
gpt4 key购买 nike

是否有任何 API 可以让 main goroutine 永远休眠?

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

最佳答案

“ sleep ”

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

例如 select没有任何case (并且没有 default ):

select{}

或者从没有人发送任何东西的 channel 接收:

<-make(chan int)

或从 nil 接收 channel 也永远阻塞:

<-(chan int)(nil)

或发送到 nil channel 也永远阻塞:

(chan int)(nil) <- 0

或者锁定一个已经锁定的sync.Mutex :

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

退出

如果您确实想提供一种退出方式,一个简单的 channel 就可以做到。提供 quit channel ,并从中接收。想退出时,关闭quit channel 作为“关闭 channel 上的接收操作总是可以立即进行,在接收到任何先前发送的值之后产生元素类型的 zero value”。

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)可能随时终止您的应用程序。引自 Spec: Program execution:

Program execution begins by initializing the main package and then invoking the function main. When that function invocation returns, the program exits. It does not wait for other (non-main) goroutines to complete.

close(quit)被执行,我们的 main() 的最后一条语句函数可以继续,这意味着 main goroutine 可以返回,所以程序退出。

sleep 不阻塞

上面的构造阻塞了goroutine,所以如果你没有运行其他goroutine,就会导致死锁。

如果您不想阻止 main goroutine 但你只是不想让它结束,你可以使用 time.Sleep() 具有足够大的持续时间。最大持续时间值为

const maxDuration time.Duration = 1<<63 - 1

大约是 292 年。

time.Sleep(time.Duration(1<<63 - 1))

如果您担心您的应用会运行超过 292 年,请将上述 sleep 置于无限循环中:

for {
time.Sleep(time.Duration(1<<63 - 1))
}

关于Go 项目的主要 goroutine 永远休眠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36419054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com