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) 文件获取完整的使用示例。 |