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

时间:2015-11-11 06:40:24

标签: go tcp timer rudp

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

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

天真的方法如下:

  1. 发送数据包;
  2. 创建一个计时器(也将创建一个新的goroutine),以在计时器触发前检查是否收到了ACK。
  3. 这很简单,但创造很多goroutine并不是免费的。我不认为TCP中的数据包重传实现使用这种方法。

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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