我创建了一个守护进程,其目标是并行使用队列。为了测试它是否在后台继续执行,我实现了一个每隔10秒创建一个文件的函数,直到达到X,其中X是我为队列配置的最大进程数。队列的参数在config.yaml文件中定义。
现在的问题是,即使我停止并删除守护程序,似乎程序仍在运行并创建文件...我已经尝试再次构建和运行程序,退出程序,结束进程,删除文件,但似乎没有任何工作,文件继续在程序目录中创建。
答案 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。
这样,由于问题规模要小得多,你可以自己解决问题 如果没有,至少这里的人会更容易帮助你。