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

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

rpc 方法的定時器實現

rpc 方法的定時器實現

Go
三國紛爭 2022-05-18 10:41:53
我有一個服務于客戶端請求的 Go RPC 服務器??蛻舳讼蚍掌髡埱蠊ぷ鳎ɑ蛉蝿眨?,服務器將任務分配給客戶端。服務器期望工作人員(或客戶端)在時間限制內完成任何任務。因此,服務器端需要一個超時事件回調機制。這是我到目前為止所嘗試的。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}在上述來自工作人員(或客戶端)的每個請求的片段中,服務器端的處理程序啟動一個計時器和一個 goroutine。goroutine 在向客戶端發送回復之前還原處理函數所做的更改。有什么方法可以創建“一組定時器”并阻止等待“一組定時器”?此外,每當計時器到期時,阻塞等待就會喚醒并為我們提供計時器句柄。根據計時器類型,我們可以在運行時執行不同的到期處理函數。我正在嘗試在 Go 中實現一個類似的機制,我們可以在 C++ 中使用timerfd with epoll.Go 中計時器示例實現的完整代碼。server.go和client.go。
查看完整描述

1 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超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)

}

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


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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