并发同时保序

2018-12-25

今天有同事问起,如何并发执行任务,同时保持让结果有序。

我记得以前写过一段代码,想起来很精妙,应该 share 出来。

type task struct {
    sync.WaitGroup
}
func main() {
    for t := range <-task {
        sendToWorker(ch, t)
        sendToKeepOrder(fifo, t)
    }

    for t := range <-fifo {
        t.wait()
    }
}
func worker(ch) {
    for t := range ch {
        t.Done()
    }
}

同时把任务往两个队列里面扔,一个用于实现并发,另一个用于实现先进先出。同时用一个 WaitGroup 来保序。

最早这段代码出现在这里

https://github.com/pingcap/tidb/pull/6323#discussion_r193763230

更早的启发应该来源于这里的一个场景,往各个 region 发请求需要并行,而结果又需要是按发送顺序返回。

https://github.com/pingcap/tidb/pull/2804/files#diff-c27388ffb48c6f6eaeefe07dd3243530R406

golang