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