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

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

在Go中偵聽事件的慣用方法是什么?

在Go中偵聽事件的慣用方法是什么?

Go
慕工程0101907 2021-05-19 13:10:44
幾個月前,我在考慮如何在Go中為RPC庫實現可關閉的事件循環。我設法方便地關閉服務器,如下所示:type Server struct {    listener net.Listener    closeChan chan bool    routines sync.WaitGroup}func (s *Server) Serve() {    s.routines.Add(1)    defer s.routines.Done()    defer s.listener.Close()    for {        select {            case <-s.closeChan:                // close server etc.            default:                s.listener.SetDeadline(time.Now().Add(2 * time.Second))                conn, _ := s.listener.Accept()                // handle conn routine        }    }}func (s *Server) Close() {    s.closeChan <- true // signal to close serve routine    s.routines.Wait()}我發現此實現的問題在于它涉及超時,這意味著最小關閉時間比可能的要多2秒。有沒有更慣用的方法來創建事件循環?
查看完整描述

1 回答

?
波斯汪

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

我認為Go中的事件循環不必是循環。


在單獨的goroutine中處理關閉和連接似乎更簡單:


go func() {

    <-s.closeChan

    // close server, release resources, etc.

    s.listener.Close()

}()

for {

    conn, err := s.listener.Accept()

    if err != nil {

         // log, return

    }

    // handle conn routine

}

請注意,您也可以在不使用通道的情況下直接在“關閉”函數中關閉偵聽器。我在這里所做的是使用Listener.Accept的錯誤返回值來促進例程間的通信。


如果在關閉和連接處理實現的某個時候需要保護要在回答時關閉的某些資源,則可以使用Mutex。但是通常可以避免這種情況。


查看完整回答
反對 回復 2021-05-24
  • 1 回答
  • 0 關注
  • 246 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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