【问题标题】:Golang daemon with goroutines won't stop executing带有 goroutine 的 Golang 守护进程不会停止执行
【发布时间】:2016-06-14 08:53:00
【问题描述】:

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

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

您可以查看程序代码here,以及配置文件here。 你知道我该如何解决这个问题吗? 提前致谢!

【问题讨论】:

    标签: multithreading go daemon background-process goroutine


    【解决方案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 子句移到它们自己的 goroutine 中,并在那里有一个退出信号,如下所示:

    select {
        case <-quit:
            return
    }
    

    虽然这不是在 Go 应用程序中处理启动/停止的最简洁方式;它只是显示了问题。

    【讨论】:

      【解决方案2】:

      在提出此类问题时,您应该考虑将MCVE 放在一起。

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

      【讨论】:

        最近更新 更多