go - 如何最好地保持一个长时间运行的 Go 程序运行?

标签 go daemon goroutine

我有一个用 Go 编写的长期运行的服务器。 Main 触发了几个执行程序逻辑的 goroutine。在那之后, main 没有任何用处。一旦 main 退出,程序将退出。我现在用来保持程序运行的方法只是对 fmt.Scanln() 的简单调用。我想知道其他人如何阻止 main 退出。下面是一个基本的例子。这里可以使用哪些想法或最佳实践?

我考虑过创建一个 channel 并通过在所述 channel 上接收来延迟 main 的退出,但我认为如果我的所有 goroutine 在某个时候都变为非事件状态,这可能会出现问题。

旁注:在我的服务器(不是示例)中,程序实际上并未连接到 shell 运行,因此无论如何与控制台交互都没有意义。现在它可以工作,但我正在寻找“正确”的方式,假设有一个。

package main

import (
    "fmt"
    "time"
)

func main() {
    go forever()
    //Keep this goroutine from exiting
    //so that the program doesn't end.
    //This is the focus of my question.
    fmt.Scanln()
}

func forever() {
    for ; ; {
    //An example goroutine that might run
    //indefinitely. In actual implementation
    //it might block on a chanel receive instead
    //of time.Sleep for example.
        fmt.Printf("%v+\n", time.Now())
        time.Sleep(time.Second)
    }
}

最佳答案

永远封锁。例如,

package main

import (
    "fmt"
    "time"
)

func main() {
    go forever()
    select {} // block forever
}

func forever() {
    for {
        fmt.Printf("%v+\n", time.Now())
        time.Sleep(time.Second)
    }
}

关于go - 如何最好地保持一个长时间运行的 Go 程序运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9543835/

相关文章:

c - dbus 如何重新连接到新的 session 总线守护进程

for-loop - 字符串 slice 的范围不一致

go - 如何将数组处理分离到 goroutines 中?

multithreading - 字符串与整数作为 golang 中内存利用率的映射键?

google-app-engine - 在 App Engine 中使用 rpc/jsonrpc

function - 以矩阵接口(interface)为参数的Go函数

go - 如何将 JWT 身份验证添加到 swagger (go + echo + swaggo/swag)

linux - 如何为 docker 守护进程传递附加参数

go - 在 Iris、Party 中将路由器分组到外部文件中

用于守护应用程序的 python 软件包/工具