1

我正在尝试在 golang 中实现 Reliable-UDP。

我需要实现的基本功能之一是数据包重传。

天真的方法如下:

  1. 发送数据包;
  2. 创建一个计时器(也将创建一个新的 goroutine)来检查是否在计时器触发之前收到了 ACK。

这很简单,但是创建很多 goroutine 并不是免费的。而且我不认为 TCP 中数据包重传的实现使用这种方法。

那么,有没有办法在不创建新 goroutine 的情况下回调函数?

我已经检查了 golang-nuts 的帖子(https://groups.google.com/forum/#!topic/golang-nuts/ja8j7wQUB-0),但仍然无法找到解决方案。

4

2 回答 2

0

您可以使用time.NewTicker创建一个计时器对象,这将提供一个定期发送消息的通道。

于 2015-11-11T08:14:16.283 回答
0

您想创建一个包含所有计划超时的单一优先级队列。单个 goroutine 应该检查优先级队列的头部,休眠直到下一次超时,然后执行相关代码或丢弃它。

当然,您将需要处理同步问题。Java 方法是通过锁来保护优先级队列。更可行的方法是让超时处理 goroutine 负责排队超时,它通过专用通道接收超时。

packagecontainer/heap中有一个优先队列实现,但我没有检查它有多好。

于 2015-11-11T16:24:24.027 回答