Home

Awesome

Task Pool

Task Pool 是一个易于使用且高度可配置的 golang类库,专门用于任务的管理&执行,支持自定义次数的重发。

功能特点

安装

go get github.com/overtalk/task

使用步骤

1.配置Config

启动 taskPool 进程

c := task.GetDefaultConfig()
taskPool, err := task.NewTaskPool(c)
if err != nil {
    log.Fatal(err)
}
taskPool.Start() // 启动 task pool 实例

3.调用 PushTask 方法加入任务

type Task interface {
	Execute() error
	CallBack(result *Result)
}
// 执行任务
for i := 0; i < 10; i++ {
    t := &myTask{
        name:  fmt.Sprintf("task - %d", i),
        times: 0,
    }
    taskPool.PushTask(t)
}

4.关闭 taskPool

taskPool.SafeClose()

5.获取任务执行结果

type myTask struct {
	name  string
	times int
}

func (myTask *myTask) Execute() error {
	fmt.Printf("*Execute* [%s], times = [%d]\n", myTask.name, myTask.times)

	if myTask.times == 0 {
		myTask.times++
		return errors.New("fail")
	}

	return nil
}

func (myTask *myTask) CallBack(result *task.Result) {
    if result.IsSuccessful() {
        fmt.Printf("*success* [%s]! times = [%d]\n", myTask.name, myTask.times)
    } else {
        fmt.Printf("*fail* [%s]! times = [%d]\n", myTask.name, myTask.times)
    }
}

taskPool 配置详解

参数类型描述
MaxTaskNumInt单个 taskPool 实例能缓存的任务数量上限,默认为 1000。
MaxBlockSecInt如果 taskPool 任务数量已达数量上限,调用者在 PushTask 方法上的最大阻塞时间,默认为 60 秒。<br/>如果超过这个时间后任务数量没有空余,PushTask 方法会抛出TimeoutException。如果将该值设为0,当任务数量无法得到满足时,PushTask 方法会立即抛出 TimeoutException。如果您希望 PushTask 方法一直阻塞直到任务数量得到满足,可将该值设为负数。
MaxIoWorkerNumInt64单个 taskPool 能并发的最多groutine的数量,默认为50,该参数用户可以根据自己实际服务器的性能去配置。
MaxRetryTimesInt如果某个 task 首次执行失败,能够对其重试的次数,默认为 10 次。<br/>如果 retries 小于等于 0,该 ProducerBatch 首次发送失败后将直接进入失败队列。
BaseRetryBackOffMsInt64首次重试的退避时间,默认为 100 毫秒。 taskPool 采样指数退避算法,第 N 次重试的计划等待时间为 baseRetryBackOffMs * 2^(N-1)。
MaxRetryBackOffMsInt64重试的最大退避时间,默认为 50 秒。

问题反馈

如果您在使用过程中遇到了问题,可以创建 GitHub Issue