在Golang中的一个简单的批量作业处理应用程序

246 阅读1分钟

在这个例子中,我们要把多个作业分成一组批处理,每批最多包含3个作业。下一个批次将等待前一个批次完成。

package main

import "fmt"

var (
	// batchSize defines the batch size where each job batch will contain maximum certain number of jobs.
	batchSize = 3
	// jobs contains the resources we are going to process.
	jobs = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"}
)

func main() {
	fmt.Println("BEGIN")

	for i := 0; i < len(jobs); i += batchSize {
		j := i + batchSize
		if j > len(jobs) {
			j = len(jobs)
		}

		fmt.Printf("batch %d: ", batchNo(i))
		processor(jobs[i:j])
	}

	fmt.Println("END")
}

func processor(jobs []string) {
	fmt.Println(jobs)
}

func batchNo(i int) int  {
	if i == 0 {
		i = 1
	} else if i == batchSize {
		i = 2
	} else if i == batchSize * 2 {
		i = 3
	} else {
		i = (i / batchSize) + 1
	}

	return i
}

输出

BEGIN
batch 1: [a b c]
batch 2: [d e f]
batch 3: [g h i]
batch 4: [j]
END

其他例子

你也可以使用下面的例子:

func batcher() {
	batch := make(map[int][]string)

	j := 0
	for i := 0; i < len(jobs); i++ {
		if i != 0 && i%batchSize == 0 {
			j++
		}

		batch[j] = append(batch[j], jobs[i])
	}

	fmt.Println(batch)
}
func batcher() {
	j := 1
	for i := 0; i < len(jobs); i++ {
		if j == batchSize {
			fmt.Println(jobs[i])
			j = 1
			continue
		}

		fmt.Printf(jobs[i])
		j++
	}
}