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

从每个例程中,我轮询其相应的服务器作业:完成了吗?我的出站请求受速率限制,因此我需要进行智能轮询。

我想优先使用工作较早开始的go例程进行轮询。我现在的操作方式是,有一个 channel 代表我的速率限制,并且所有例程都从该 channel 获取值,轮询其服务器,然后放回值。

但是,不能保证这些go例程甚至会随机读取(优先级顺序要少得多),因为在同一 channel 上读取多个go例程的行为是不确定的。

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

这似乎很困难,因为单个goroutine不知道整个程序的状态-他们的哪个同事例程首先启动,等等。无论是否应该在任何给定时间轮询服务器,都应该给他们喂食。

谢谢你。

最佳答案

您听说过加权公平队列吗?这是一种先进的计划方式,可以预测理论上应该首先完成的工作,也就是要提供服务的工作。

10-08 02:23