Go:并发和优先顺序

Go: Concurrency and priority ordering

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

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

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

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

谁能指导我如何思考这个问题?它不必是特定的,但我不确定我会在 Go 中使用什么原语和数据结构按优先顺序从通道读取,同时考虑速率限制。

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

谢谢。

您听说过加权公平队列吗?这是一种完善的调度方式,可以预测理论上应该首先完成的工作,即服务的工作。