Concurrency Go:并发性和优先级排序

Concurrency Go:并发性和优先级排序,concurrency,go,priority-queue,Concurrency,Go,Priority Queue,我有n~=1000个作业在外部服务器上运行,每个作业都与我程序中的一个go例程相关联。我在不同的时间开始工作,他们大致按照开始的顺序完成,但这不能保证 从每个go例程中,我轮询其相应的服务器作业:是否完成了?我的出站请求受速率限制,因此我需要进行智能轮询 我想优先考虑那些工作开始较早的围棋轮询例程。我现在的做法是,我有一个代表我的速率限制的通道,所有go例程都等待从这个通道获取一个值,轮询他们的服务器,然后将一个值放回 但是,不能保证这些go例程会随机读取(更不用说优先级顺序),因为在同一通道上

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

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

我想优先考虑那些工作开始较早的围棋轮询例程。我现在的做法是,我有一个代表我的速率限制的通道,所有go例程都等待从这个通道获取一个值,轮询他们的服务器,然后将一个值放回


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

有人能指导我如何思考这个问题吗?它不必是具体的,但我不确定我将使用什么原语和数据结构,以优先顺序从通道中读取,同时考虑到速率限制

这似乎很困难,因为每个goroutine都不知道整个程序的状态——他们的同事例程中的哪一个是首先启动的,等等。不管他们是否应该在任何给定的时间轮询他们的服务器,都应该只向他们提供信息


谢谢。

你听说过加权公平排队吗?这是一种非常成熟的日程安排方法,可以预测理论上应该首先完成哪项工作,而这项工作就是要提供服务的工作。

我没有听说过。谢谢你的建议;我会看一看,“因为在同一频道上读取多个go例程的行为是未定义的”-你能告诉我你在哪里找到这些信息吗?我也有类似的情况,非常想得到一些关于这方面的文件