带goroutines的Golang守护进程不会停止执行

时间:2016-06-14 08:53:01

标签: multithreading go daemon background-process goroutine

我创建了一个守护进程,其目标是并行使用队列。为了测试它是否在后台继续执行,我实现了一个每隔10秒创建一个文件的函数,直到达到X,其中X是我为队列配置的最大进程数。队列的参数在config.yaml文件中定义。

现在的问题是,即使我停止并删除守护程序,似乎程序仍在运行并创建文件...我已经尝试再次构建和运行程序,退出程序,结束进程,删除文件,但似乎没有任何工作,文件继续在程序目录中创建。

您可以查看程序代码here和配置文件here。 你知道我怎么能解决这个问题吗? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

此代码在处理len(queues)次之前永远不会退出。它不是并发代码 - 全部在主体中 - 并且没有信号告诉代码停止。问题出在这里:

case "run":
    // Installing the service
    installed, err := service.Install()
    logError(err, installed)
    // Starting the service
    started, err := service.Start()
    logError(err, started)
    if err == nil {
        // Creating a goroutine and executing the queue's processes in parallel
        for i := 0; i < len(queues); i++ {
            go startProcessing(queues[i])
            time.Sleep(time.Second) // Waiting for other functions to execute
        }
        select {} // To prevent the goroutine from exiting the main func
    }
    fmt.Println(started)

可以看出select{}线将坐在那里并永远奔跑! :)最好将这个case子句移动到他们自己的goroutines中并在那里有一个退出信号:

select {
    case <-quit:
        return
}

虽然这不是处理Go应用中启动/停止的最简洁方法;它只是表明了问题。

答案 1 :(得分:0)

在提出这样的问题时,你应该考虑整理MCVE

这样,由于问题规模要小得多,你可以自己解决问题 如果没有,至少这里的人会更容易帮助你。