129 lines
3.1 KiB
Markdown
129 lines
3.1 KiB
Markdown
|
|
# Task包使用说明
|
|||
|
|
|
|||
|
|
## 概述
|
|||
|
|
|
|||
|
|
Task包提供了一个基本的任务队列和执行框架,用于管理、调度和执行各种控制任务。它支持并发执行、任务优先级和优雅的任务管理。
|
|||
|
|
|
|||
|
|
## 核心组件
|
|||
|
|
|
|||
|
|
### 1. Task接口
|
|||
|
|
所有任务都需要实现Task接口,包含以下方法:
|
|||
|
|
- `Execute() error` - 执行任务
|
|||
|
|
- `GetID() string` - 获取任务ID
|
|||
|
|
- `GetPriority() int` - 获取任务优先级
|
|||
|
|
|
|||
|
|
### 2. Executor(执行器)
|
|||
|
|
负责管理任务队列和执行任务,支持并发执行。
|
|||
|
|
|
|||
|
|
### 3. TaskQueue(任务队列)
|
|||
|
|
用于存储和管理待执行的任务。
|
|||
|
|
|
|||
|
|
## 使用方法
|
|||
|
|
|
|||
|
|
### 1. 实现任务
|
|||
|
|
|
|||
|
|
首先,需要实现Task接口来创建自定义任务:
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
type MyTask struct {
|
|||
|
|
id string
|
|||
|
|
priority int
|
|||
|
|
// 其他任务特定字段
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (t *MyTask) Execute() error {
|
|||
|
|
// 实现任务逻辑
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (t *MyTask) GetID() string {
|
|||
|
|
return t.id
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func (t *MyTask) GetPriority() int {
|
|||
|
|
return t.priority
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 创建和启动执行器
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
// 创建执行器,指定工作协程数量
|
|||
|
|
executor := task.NewExecutor(5) // 5个工作协程
|
|||
|
|
|
|||
|
|
// 启动执行器
|
|||
|
|
executor.Start()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. 提交任务
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
// 创建任务实例
|
|||
|
|
myTask := NewMyTask("task-1", 1)
|
|||
|
|
|
|||
|
|
// 提交任务到执行器
|
|||
|
|
executor.SubmitTask(myTask)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. 停止执行器
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
// 停止执行器(会等待所有正在执行的任务完成)
|
|||
|
|
executor.Stop()
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 处理定时循环任务
|
|||
|
|
|
|||
|
|
对于定时循环任务,建议采用以下方式:
|
|||
|
|
|
|||
|
|
1. 使用`time.Ticker`定期创建任务
|
|||
|
|
2. 将任务提交到执行器
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
func RunScheduledTasks(executor *task.Executor) {
|
|||
|
|
// 启动一个协程来定期提交定时任务
|
|||
|
|
go func() {
|
|||
|
|
ticker := time.NewTicker(30 * time.Second) // 每30秒执行一次
|
|||
|
|
defer ticker.Stop()
|
|||
|
|
|
|||
|
|
for {
|
|||
|
|
select {
|
|||
|
|
case <-ticker.C:
|
|||
|
|
// 创建定时任务并提交
|
|||
|
|
scheduledTask := NewScheduledTask("scheduled-task", 1)
|
|||
|
|
executor.SubmitTask(scheduledTask)
|
|||
|
|
case <-executor.ctx.Done():
|
|||
|
|
return // 执行器已停止
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}()
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 处理互不相关的独立任务
|
|||
|
|
|
|||
|
|
对于互不相关的独立任务,可以直接创建并提交:
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
// 创建多个独立任务
|
|||
|
|
task1 := NewIndependentTask("task-1", "data1", 1)
|
|||
|
|
task2 := NewIndependentTask("task-2", "data2", 2)
|
|||
|
|
task3 := NewIndependentTask("task-3", "data3", 1)
|
|||
|
|
|
|||
|
|
// 提交所有任务
|
|||
|
|
executor.SubmitTask(task1)
|
|||
|
|
executor.SubmitTask(task2)
|
|||
|
|
executor.SubmitTask(task3)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 最佳实践
|
|||
|
|
|
|||
|
|
1. **合理设置工作协程数量**:根据系统资源和任务特性设置适当的工作协程数量
|
|||
|
|
2. **正确处理任务错误**:在任务的Execute方法中正确处理和返回错误
|
|||
|
|
3. **合理设置任务优先级**:重要的任务可以设置更高的优先级
|
|||
|
|
4. **优雅关闭**:使用Stop方法确保所有任务都能正确完成
|
|||
|
|
5. **避免任务阻塞**:任务执行时间过长会阻塞工作协程
|
|||
|
|
|
|||
|
|
## 示例
|
|||
|
|
|
|||
|
|
请参考 [example_task.go](./example_task.go) 和 [usage_example.go](./usage_example.go) 文件获取完整的使用示例。
|