2016-06-14 13 views
1

私は並列でキューを消費するという目的を持ったデーモンを作成しました。バックグラウンドで実行を継続するかどうかをテストするために、Xに達するまで10秒ごとにファイルを作成する関数を実装しました。ここでXはキューに対して設定したプロセスの最大数です。キューのパラメータはconfig.yamlファイルで定義されています。GolangデーモンとGorutinesの実行が停止しない

デーモンを停止して削除しても、プログラムが実行され続けてファイルを作成しているようです...プログラムをビルドして実行した後、プログラムを終了して終了し、プロセスを終了し、削除しますファイルは何も動作していないようですが、ファイルはプログラムディレクトリに作成され続けます。

プログラムコード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 
} 

。それは単に問題を示しています。

0

このような質問をするときは、MCVEをまとめることを検討する必要があります。

このように、問題のサイズがはるかに小さいので、あなた自身で問題を把握することができます。
もしそうでなければ、少なくともここの人々はあなたを助けるのにもっと簡単な時間を持っています。

関連する問題