2016-06-14 11 views
1

Ich habe einen Daemon erstellt, der das Ziel hat, Warteschlangen parallel zu konsumieren. Um zu testen, ob es weiterhin im Hintergrund läuft, habe ich eine Funktion implementiert, die alle 10 Sekunden eine Datei erstellt, bis sie X erreicht, wobei X die höchste Anzahl von Prozessen ist, die ich für die Warteschlangen konfiguriert habe. Die Parameter für die Warteschlangen sind in der Datei config.yaml definiert.Golang-Daemon mit goroutines wird nicht aufhören

Das Problem ist jetzt, dass, obwohl ich den Dämon stoppe und entferne, es scheint, dass das Programm weiter läuft und Dateien erzeugt ... Ich habe versucht, das Programm wieder aufzubauen und auszuführen, es zu beenden, die Prozesse zu beenden die Dateien, aber nichts scheint zu funktionieren, Dateien werden weiterhin im Programmverzeichnis erstellt. Sie können den Programmcode here und die Konfigurationsdatei here überprüfen. Haben Sie eine Idee, wie ich dieses Problem lösen kann? Vielen Dank im Voraus!

Antwort

1

Dieser Code wird niemals beendet, bis er len(queues) Mal verarbeitet. Es ist kein gleichzeitiger Code - alles im Hauptteil - und es gibt kein Signal, um den Code anzuhalten. Das Problem ist hier:

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) 

Da es die select{} Linie dort sitzen gesehen werden kann, wird und laufen immer! :) Es ist besser, diesen Fall Klauseln zu bewegen, in ihre eigenen goroutines und haben ein Signal beenden es wie folgt aus:

select { 
    case <-quit: 
     return 
} 

Obwohl dies nicht der sauberste Weg/Stop in Go-Anwendungen zu handhaben ist zu beginnen; Es zeigt nur das Problem.

0

Wenn Sie Fragen wie diese stellen, sollten Sie sich überlegen, eine MCVE zusammenzustellen.

Auf diese Weise, da die Problemgröße viel kleiner ist, können Sie das Problem selbst herausfinden.
Wenn nicht, werden zumindest die Leute hier leichter Ihnen helfen können.