第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在Go中偵聽(tīng)事件的慣用方法是什么?

在Go中偵聽(tīng)事件的慣用方法是什么?

Go
慕工程0101907 2021-05-19 13:10:44
幾個(gè)月前,我在考慮如何在Go中為RPC庫(kù)實(shí)現(xiàn)可關(guān)閉的事件循環(huán)。我設(shè)法方便地關(guān)閉服務(wù)器,如下所示: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()}我發(fā)現(xiàn)此實(shí)現(xiàn)的問(wèn)題在于它涉及超時(shí),這意味著最小關(guān)閉時(shí)間比可能的要多2秒。有沒(méi)有更慣用的方法來(lái)創(chuàng)建事件循環(huán)?
查看完整描述

1 回答

?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個(gè)贊

我認(rèn)為Go中的事件循環(huán)不必是循環(huán)。


在單獨(dú)的goroutine中處理關(guān)閉和連接似乎更簡(jiǎn)單:


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

}

請(qǐng)注意,您也可以在不使用通道的情況下直接在“關(guān)閉”函數(shù)中關(guān)閉偵聽(tīng)器。我在這里所做的是使用Listener.Accept的錯(cuò)誤返回值來(lái)促進(jìn)例程間的通信。


如果在關(guān)閉和連接處理實(shí)現(xiàn)的某個(gè)時(shí)候需要保護(hù)要在回答時(shí)關(guān)閉的某些資源,則可以使用Mutex。但是通??梢员苊膺@種情況。


查看完整回答
反對(duì) 回復(fù) 2021-05-24
  • 1 回答
  • 0 關(guān)注
  • 241 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)