rpc 方法的定时器实现

我有一个服务于客户端请求的 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。


三国纷争
浏览 107回答 1
1回答

蓝山帝景

我建议你探索上下文包可以这样做:func main() {&nbsp; &nbsp; c := context.Background()&nbsp; &nbsp; wg := &sync.WaitGroup{}&nbsp; &nbsp; f(c, wg)&nbsp; &nbsp; wg.Wait()}func f(c context.Context, wg *sync.WaitGroup) {&nbsp; &nbsp; c, _ = context.WithTimeout(c, 3*time.Second)&nbsp; &nbsp; wg.Add(1)&nbsp; &nbsp; go func(c context.Context) {&nbsp; &nbsp; &nbsp; &nbsp; defer wg.Done()&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case <-c.Done():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("f() Done:", c.Err())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; case r := <-time.After(5 * time.Second):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("f():", r)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }(c)}基本上,您启动一个基本上下文,然后从中派生其他上下文,当一个上下文终止时,无论是通过传递时间还是调用其close,它都会关闭其Done通道和从它派生的所有上下文的Done通道.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go