【问题标题】:Go: Concurrency and priority orderingGo:并发和优先排序
【发布时间】:2015-06-02 06:48:03
【问题描述】:

我有 n ~=1000 个作业在外部服务器上运行,每个作业都与我程序中的一个 go-routine 相关联。我在不同的时间开始了这些工作,它们大致按照开始的顺序完成,但这并不能保证。

我从每个 go-routine 轮询其对应的服务器作业:它完成了吗?我的出站请求是有速率限制的,所以我需要巧妙地轮询。

我想优先通过其工作开始较早的 go-routines 进行轮询。我现在这样做的方式是,我有一个表示我的速率限制的通道,所有 go-routines 都等待从这个通道获取一个值,轮询他们的服务器,然后放回一个值。

但是,不能保证这些 go-routines 甚至会随机读取(按优先级顺序要少得多),因为在同一通道上读取的多个 go-routines 的行为是未定义的。

有人可以指导我如何思考这个问题吗?它不一定是具体的,但我不确定我将在 Go 中使用哪些原语和数据结构按优先顺序从通道中读取,同时考虑到速率限制。

这似乎很困难,因为单个 goroutine 不知道整个程序的状态——他们的同事例程中的哪个是最先启动的,等等。他们应该只接受他们是否应该在任何给定时间轮询他们的服务器。

谢谢。

【问题讨论】:

  • “因为在同一个频道上读取的多个 go-routines 的行为是未定义的” - 你能指出你在哪里找到这个信息吗?我也有类似的情况,非常想获得一些关于此的文档

标签: concurrency go priority-queue


【解决方案1】:

您听说过加权公平队列吗?这是一种成熟的调度方式,可以预测理论上应该首先完成哪个作业,而这就是要服务的作业。

【讨论】:

  • 我没有听说过他们。感谢您的建议;我去看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
相关资源
最近更新 更多