思路:通过goroutine实现并行,通过task的数量来控制,只有一个task就是串行,多个就是并行。
核心代码如下
batch.go
type batchTasks struct { size int tasks []Task } func (t *batchTasks) Do(c *Context) { var wg sync.WaitGroup for i, task := range t.tasks { if c.err != nil { break } wg.Add(1) go func(task Task) { defer wg.Done() defer c.catcher() task.Do(c) }(task) if i%t.size == 0 { wg.Wait() } } wg.Wait() }
串行
chain.go
func Chain(tasks ...Task) Task { return &batchTasks{ size: 1, tasks: tasks, } }
并行
func Multi(tasks ...Task) Task { return &batchTasks{ size: len(tasks), tasks: tasks, } }