我有一個服務于客戶端請求的 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通道.
- 1 回答
- 0 關注
- 117 瀏覽
添加回答
舉報
0/150
提交
取消