2017-11-20 11 views
-2

darwin/amd64のGo 1.9.2で実行時エラーが発生するgoroutineがあります。無効なメモリアドレスまたはnilポインタの逆参照です。私はルーチンの順序に関係する何らかの競合条件が原因だと思うが、私はよくわからない。HTTP.Serverシャットダウンでランタイムエラーが発生する

メインアプリケーションが行っているいくつかのことがあります。そのため、ゴルーチンとしてウェブサーバーを起動し、親プロセスからの終了信号を待ち受け、すべてをシャットダウンしてから戻します。ここで

機能です:

// WebServer defines the handler endpoints and launches the web server listener 
func WebServer(wg *sync.WaitGroup) { 

    // Make sure the exit is noted 
    defer wg.Done() 

    // Endpoint, handler function 
    http.HandleFunc("/version", WebShowVersion) 

    // Go forth and serve 
    // Define the server struct 
    srv := &http.Server{Addr: ":8080"} 

    // Now go serve 
    chnToLogger <- "Launching web server on port 8080" 
    go func() { 
     err := srv.ListenAndServe() 
     if err != nil && 
      err.Error() != "http: Server closed" { 

      // There...was an error 
      chnToLoggerError <- "Error launching web server: " + err.Error() 
     } 
    }() 

    // Listen for a shutdown 
    for { 
     select { 
     case <-chnQuitNow: 

      // Shut down the process 
      chnToLogger <- "Shutting down web server process" 
      if err := srv.Shutdown(nil); err != nil { 

       // There was a problem shutting down gracefully 
       chnToLoggerError <- "Error shutting down web server: " + err.Error() 
       return 
      } 

      // Done 
      chnToLogger <- "Web server has shut down now" 
      return 

     default: 
      continue 
     } 
    } 

    // Done 
    return 
} 

パニック状態:

panic: runtime error: invalid memory address or nil pointer dereference 
[signal SIGSEGV: segmentation violation code=0x1 addr=0x28 pc=0x11f7e61] 

goroutine 10 [running]: 
net/http.(*Server).Shutdown(0xc420158000, 0x0, 0x0, 0x0, 0x0) 
    /usr/local/go/src/net/http/server.go:2506 +0x1b1 
main.WebServer(0xc4200164a0) 
    /Users/me/go/src/testproj/webhandling.go:45 +0x146 
created by main.main 
    /Users/me/go/src/testproj/main.go:94 +0x3d6 

ライン45をwebhandling.goである:

if err := srv.Shutdown(nil); err != nil { 

それがトリガーされる中で一貫していないですが、私はプログラムを起動し、ローカルホストをプルするためにWebクライアントを使用する場合にのみ発生するように見えます:8080/version a fe wr回、srv.Shutdown(nil)が参照を持っていても既に終了している接続を終了しようとしているのではないかと思うのですか?

1)ゴルーチンから戻る前に、サーバーにWebサーバーのプロセスを安全かつ完全にシャットダウンさせることは可能ですか?

2)矛盾した実行時エラーが引き起こされる原因は何ですか?

+1

シャットダウンへのパスが「nil」になっていますか? – mkopriva

+0

..「シャットダウン」がソースに対して保護されているソース(https://github.com/golang/go/blob/master/src/net/http/server.go#L2514-L2538)のどこでも見ることができませんnil contenxt。 – mkopriva

+0

@mkopriva - 私は、この質問から受け入れられた "具体的な例"に関数を基づいていますが、これはnilを使用しています:https://stackoverflow.com/questions/39320025/how-to-stop-http-listenandserveなぜなら、なぜ私がそれを使用していたのかということだけを述べているからです。) –

答えて

関連する問題