Go 按顺序并发执行作业

Go 按顺序并发执行作业,go,concurrency,sequential,Go,Concurrency,Sequential,“什么?”你问,“这个标题毫无意义。” 考虑以下几点: 具有不同id的作业可以异步处理,但具有相同id的作业应同步处理,并从队列中按顺序处理 我当前的实现创建了一个go例程来处理每个特定id的作业,如下所示: func FanOut() chan<- *Job { channel := make(chan *Job) routines = make(map[string]chan<- *Job) go func() { for j := ran

“什么?”你问,“这个标题毫无意义。”

考虑以下几点: 具有不同id的作业可以异步处理,但具有相同id的作业应同步处理,并从队列中按顺序处理

我当前的实现创建了一个go例程来处理每个特定id的作业,如下所示:

func FanOut() chan<- *Job {
    channel := make(chan *Job)
    routines = make(map[string]chan<- *Job)
    go func() {
        for j := range channel {
            r, found := routines[j.id]
            if !found {
                r = Routine()
                routines[j.id] = r
            }
            r <- j
        }
    }()
    return channel
}

func FanOut()chan为每个ID创建一个通道-可能是通道片段或贴图(按ID索引)。每个通道都有一个go例程,该例程按顺序处理该ID的作业。简单

我不担心创建太多的围棋程序。我不会使用互斥锁——如果不深入了解太多细节,使用通道和go例程,每次只允许一个go例程处理每个作业,并避免数据竞争的可能性


顺便说一句,我只是作为一个答案添加了这个,因为我不允许添加评论(但?)。

实际上没有“太多的goroutine”。在内部,谷歌运行的服务产生了数百万的goroutine。它们的设计是轻量级的。你可能会发现这样的信息:鉴于围棋套路的轻量级性质,你会说这里的设计是合理的吗?我没有足够的信息来说明这一点,但根据所呈现的内容,我不会立即称之为不合理。除非您测量并检测到问题,否则我认为没有问题。谢谢您的评论!