2017-01-11 24 views
1

Goでhttp.ListenAndServe()を使用している場合、アプリケーションを強制終了することができない場合があります。これは私のdefer文の処理をスキップしているようです。以下のコードをご覧ください。私はアプリケーションを殺すと、dbは閉じられません。 defer文を実行するにはどうすればよいですか?http.ListenAndServeと組み合わせてdeferを使用するには?

func main() { 
    db := NewDB(DBFILENAME) 
    defer db.Close() 
    http.HandleFunc("/", handler) 
    http.ListenAndServe(":80", nil) 
} 
+3

ListenAndServeブロック。 'defer'は、関数が戻るときにのみ実行されます。 – JimB

+0

JimB、あなたは同じ問題を説明していると思いますが、換言すれば。 – Bazzz

答えて

2

ステートメントは、それらを囲む関数が戻るときにのみ実行されます。主な機能は、あなたがそれを殺すと戻ってこない。したがって、信号とチャンネルを使用する必要があります。

これは同じことを説明する良いリンクですhttps://www.socketloop.com/tutorials/golang-intercept-ctrl-c-interrupt-or-kill-signal-and-determine-the-signal-type

最後のプロジェクトで同じ問題が発生しました。私は私のプロジェクトで同様のソリューションを実装しましたwshare。あなたのケースでは

、サーバーを安全にシャットダウンし、新たなシャットダウン機能を持つことになります1.8をリリース行く次に

 ch := make(chan os.Signal, 3) 

    signal.Notify(ch, os.Interrupt,syscall.SIGTERM,syscall.SIGINT) 


    go func() { 
      signalType := <-ch 
      signal.Stop(ch) 
      log.Println("Exit command received. Exiting...") 

      // this is a good place to flush everything to disk 
      // before terminating. 
      db.Close() 
      log.Println("Signal type : ", signalType) 

      os.Exit(0) 

    }() 
+0

または、このソリューションをご覧くださいhttp://stackoverflow.com/questions/41432193/how-to-delete-a-file-using-golang-on-program-exit/41455960#41455960 – Krash

関連する問題