Golang串行和并行任务的实现笔记

思路:通过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,
	}
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注