2014-03-03 73 views
4

我正在構建一個需要啓動自己的HTTP服務器的命令行應用程序。 我的想法是啓動夠程內的http服務器在我的主要程序是這樣的:這是在golang中終止goroutine的正確方法嗎?

func main() { 
    go myserver() 

    // perform lots of time-consuming tasks 
} 

func myserver() { 
    s := &http.Server{ 
     Addr: ":8080", 
     Handler: MyHandler{}, 
    } 
    log.Fatal(s.ListenAndServe()) 
} 
  1. 我的主要功能,需要能夠告訴夠程死亡。由於網絡服務器在ListenAndServe方法上阻塞,因此無法通過sync.WaitGroup或通道發送信號。
  2. 我的一個想法是對Web服務器發出HTTP POST,並要求它在收到特定的商定價值後自殺。

是否還有其他替代方法對golang來說是慣用的?

回答

4

如果您在運行web界面直到程序退出,您可以從主線程返回。即使另一個goroutine正在工作,從主線程返回也會退出程序。如果您希望主線程向http服務器發送kill,最好的方法是關閉監聽器。

func main() { 
    l, err := net.Listen("tcp", ":8080") 
    if err != nil { 
     log.Fatal(err) 
    } 
    go myserver(l) 

    // perform lots of time-consuming tasks 

    l.Close() 
} 

func myserver(l net.Listener) { 
    s := &http.Server{ 
     Addr: ":8080", 
     Handler: MyHandler{}, 
    } 
    log.Print(s.Serve(l)) 
} 

這將不會關閉已經打開的連接。它只會阻止新的創建。您需要爲您的處理程序添加邏輯和/或停止保持活動狀態,以確保連接在殺死偵聽器後不會重複使用很長時間。

+0

我正在觸發http客戶端請求,他們都發送「連接:關閉」。謝謝。 – canadadry

相關問題