2016-06-14 142 views
1

我已經創建了具有消費隊列並行目標的一個守護進程。爲了測試它是否在後臺繼續執行,我實現了一個函數,該函數每隔10秒創建一個文件,直到達到X,其中X是我爲隊列配置的最大進程數。隊列的參數在config.yaml文件中定義。Golang守護進程夠程不會停止執行

現在的問題是,即使我停止並刪除後臺程序,似乎該程序保持運行和創建文件......我再次嘗試構建和運行該程序,退出它,結束進程,刪除文件,但似乎沒有任何工作,文件不斷創建在程序目錄中。

您可以檢查程序代碼here和配置文件here。 你有什麼想法我可以如何解決這個問題? 在此先感謝!

回答

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{}行會坐在那裏跑,直到永遠! :)最好是有移動這種情況下的條款,到他們自己夠程,並有一個退出信號是這樣的:

select { 
    case <-quit: 
     return 
} 

雖然這不是處理開始在Go應用程序/停止最徹底的方法;它只是表明了問題。

0

當問這樣你應該考慮組建一個MCVE問題。

這樣,因爲這個問題是尺寸小了很多,你可以找出你自己的問題。
如果沒有,至少這裏的人會更容易幫助你。