为了账号安全,请及时绑定邮箱和手机立即绑定

Go:并发和优先级排序

Go:并发和优先级排序

Go
慕的地6264312 2021-10-11 10:47:11
我有 n ~=1000 个作业在外部服务器上运行,每个作业都与我的程序中的一个 go-routine 相关联。我在不同的时间开始工作,它们大致按照开始的顺序完成,但这并不能保证。我从每个 go-routine 轮询其相应的服务器作业:完成了吗?我的出站请求是有速率限制的,所以我需要巧妙地进行轮询。我想优先考虑由更早开始工作的 go-routines 进行轮询。我现在这样做的方式是,我有一个代表我的速率限制的通道,所有 go-routine 都等待从这个通道获取一个值,轮询他们的服务器,然后放回一个值。但是,不能保证这些 go-routines 甚至会随机读取(优先级顺序要少得多),因为在同一通道上读取多个 go-routines 的行为是未定义的。有人可以指导我如何思考这个问题吗?它不必是特定的,但我不确定我会在 Go 中使用哪些原语和数据结构来按优先级顺序从通道读取,同时考虑到速率限制。这似乎很困难,因为各个 goroutine 不知道整个程序的状态——它们的哪些同事例程最先启动,等等。他们应该只知道是否应该在任何给定时间轮询他们的服务器。谢谢你。
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-10-11
  • 1 回答
  • 0 关注
  • 257 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信