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

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

rpc 方法的定時器實現(xiàn)

rpc 方法的定時器實現(xiàn)

Go
三國紛爭 2022-05-18 10:41:53
我有一個服務(wù)于客戶端請求的 Go RPC 服務(wù)器。客戶端向服務(wù)器請求工作(或任務(wù)),服務(wù)器將任務(wù)分配給客戶端。服務(wù)器期望工作人員(或客戶端)在時間限制內(nèi)完成任何任務(wù)。因此,服務(wù)器端需要一個超時事件回調(diào)機制。這是我到目前為止所嘗試的。func (l *Listener) RequestHandler(request string, reply string) error {    // some other work    // ....    _timer := time.NewTimer(time.Second * 5) // timer for 2 seconds    go func() {        // simulates a client not replying case, with timeout of 2 sec        y := <-_timer.C        fmt.Println("TimeOut for client")        // revert state changes becasue of client fail    }()    // set reply    // update some states    return nil}在上述來自工作人員(或客戶端)的每個請求的片段中,服務(wù)器端的處理程序啟動一個計時器和一個 goroutine。goroutine 在向客戶端發(fā)送回復(fù)之前還原處理函數(shù)所做的更改。有什么方法可以創(chuàng)建“一組定時器”并阻止等待“一組定時器”?此外,每當(dāng)計時器到期時,阻塞等待就會喚醒并為我們提供計時器句柄。根據(jù)計時器類型,我們可以在運行時執(zhí)行不同的到期處理函數(shù)。我正在嘗試在 Go 中實現(xiàn)一個類似的機制,我們可以在 C++ 中使用timerfd with epoll.Go 中計時器示例實現(xiàn)的完整代碼。server.go和client.go。
查看完整描述

1 回答

?
藍(lán)山帝景

TA貢獻(xiàn)1843條經(jīng)驗 獲得超7個贊

我建議你探索上下文包


可以這樣做:


func main() {

    c := context.Background()

    wg := &sync.WaitGroup{}

    f(c, wg)

    wg.Wait()

}


func f(c context.Context, wg *sync.WaitGroup) {

    c, _ = context.WithTimeout(c, 3*time.Second)

    wg.Add(1)


    go func(c context.Context) {

        defer wg.Done()

        select {

        case <-c.Done():

            fmt.Println("f() Done:", c.Err())

            return

        case r := <-time.After(5 * time.Second):

            fmt.Println("f():", r)

        }

    }(c)

}

基本上,您啟動一個基本上下文,然后從中派生其他上下文,當(dāng)一個上下文終止時,無論是通過傳遞時間還是調(diào)用其close,它都會關(guān)閉其Done通道和從它派生的所有上下文的Done通道.


查看完整回答
反對 回復(fù) 2022-05-18
  • 1 回答
  • 0 關(guān)注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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