猿问

Go:并发和优先级排序

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

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

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

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

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

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

谢谢你。


慕的地6264312
浏览 258回答 1
1回答

慕勒3428872

您听说过加权公平队列吗?这是一种成熟的调度方式,可以预测理论上应该首先完成哪个作业,哪个作业应该被服务。
随时随地看视频慕课网APP

相关分类

Go
我要回答