我有一个服务于客户端请求的 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。
蓝山帝景
相关分类