亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在錯誤組中運行多個服務器的問題

在錯誤組中運行多個服務器的問題

Go
慕的地8271018 2022-06-27 17:22:30
我有一個結構:type MultiServer struct {    servers []*http.Server}func New(servers ...*http.Server) *MultiServer {    return &MultiServer{servers: servers}}func (m *MultiServer) ListenAndServe() error {    var g errgroup.Group    for _, s := range m.servers {        s := s        g.Go(s.ListenAndServe)    }    return g.Wait()}ListenAndServe如果其中一臺服務器返回錯誤,我希望它立即返回。所以我將不正確的端口傳遞給其中一臺服務器:func TestListenAndServe(t *testing.T) {    one := makeServer(":8080")    two := makeServer("::8080") // that is incorrect port    ms := New(one, two)    done := make(chan error)    go func() {        done <- ms.ListenAndServe()    }()    select {    case err := <-done:        if err == nil {            t.Fatal("error expected")        }    case <-makeTimeChan(5 * time.Second):        t.Fatal("timeout")    }}func makeServer(port string) *http.Server {    serveMux := http.NewServeMux()    hello := func(w http.ResponseWriter, req *http.Request) {        fmt.Fprintf(w, "hello\n")    }    serveMux.HandleFunc("/hello", hello)    return &http.Server{        Addr:         port,        Handler:      serveMux,        ReadTimeout:  10 * time.Second,        WriteTimeout: 10 * time.Second,    }}func makeTimeChan(d time.Duration) <-chan time.Time {    t := time.NewTimer(d)    return t.C}如果我的 MultiServer 有不止一臺服務器,我會不斷地“超時”。我認為這與循環運行服務器有關,因為如果我替換ListenAndServe為:func (m *MultiServer) ListenAndServe() error {    var g errgroup.Group    for _, s := range m.servers {        _= s        g.Go(func(){ return errors.New("")})    }    return g.Wait()}一切都按預期工作。有人可以幫我解決我做錯了什么嗎?
查看完整描述

1 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

假設您正在使用http.ListenAndServeand golang.org/x/sync/errgroup

  • Wait所有函數都返回時,一個 errgroup 的返回。

  • errgroup 的Go調用調用給定的函數,如果函數返回錯誤,則在組的上下文中調用取消函數。但是,如果您沒有調用WithContext創建具有上下文的組,那么您有一個沒有上下文的組,因此不會發生 cancel()。

您的eg.Wait()呼叫將等待兩個ListenAndServe呼叫返回。如果您有一個取消功能并使用它來停止其他 ListenAndServe調用,那將有所幫助。請參閱如何停止 http.ListenAndServe()。但是您還需要一個WithContext,以便您有辦法知道何時停止其他ListenAndServe呼叫。請注意,一旦您有兩個以上這樣的人,您將想要停止所有其他人,而不僅僅是(單數)其他人。


查看完整回答
反對 回復 2022-06-27
  • 1 回答
  • 0 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號