【发布时间】:2015-06-02 06:48:03
【问题描述】:
我有 n ~=1000 个作业在外部服务器上运行,每个作业都与我程序中的一个 go-routine 相关联。我在不同的时间开始了这些工作,它们大致按照开始的顺序完成,但这并不能保证。
我从每个 go-routine 轮询其对应的服务器作业:它完成了吗?我的出站请求是有速率限制的,所以我需要巧妙地轮询。
我想优先通过其工作开始较早的 go-routines 进行轮询。我现在这样做的方式是,我有一个表示我的速率限制的通道,所有 go-routines 都等待从这个通道获取一个值,轮询他们的服务器,然后放回一个值。
但是,不能保证这些 go-routines 甚至会随机读取(按优先级顺序要少得多),因为在同一通道上读取的多个 go-routines 的行为是未定义的。
有人可以指导我如何思考这个问题吗?它不一定是具体的,但我不确定我将在 Go 中使用哪些原语和数据结构按优先顺序从通道中读取,同时考虑到速率限制。
这似乎很困难,因为单个 goroutine 不知道整个程序的状态——他们的同事例程中的哪个是最先启动的,等等。他们应该只接受他们是否应该在任何给定时间轮询他们的服务器。
谢谢。
【问题讨论】:
-
“因为在同一个频道上读取的多个 go-routines 的行为是未定义的” - 你能指出你在哪里找到这个信息吗?我也有类似的情况,非常想获得一些关于此的文档
标签: concurrency go priority-queue