|
11 | 11 | - [实现视频裁剪任务执行器](#实现视频裁剪任务执行器)
|
12 | 12 | - [实现视频裁剪任务容器](#实现视频裁剪任务容器)
|
13 | 13 | - [实现调度](#实现调度)
|
| 14 | + - [实现同步a + b任务异步化调度](#实现同步a--b任务异步化调度) |
| 15 | + - [定义a+b任务](#定义ab任务) |
| 16 | + - [实现a+b任务执行器](#实现ab任务执行器) |
| 17 | + - [实现a+b任务容器](#实现ab任务容器) |
| 18 | + - [实现调度](#实现调度-1) |
14 | 19 |
|
15 | 20 | # 轻量级任务调度框架
|
16 | 21 |
|
@@ -167,3 +172,48 @@ func main() {
|
167 | 172 | }
|
168 | 173 | }
|
169 | 174 | ```
|
| 175 | + |
| 176 | + |
| 177 | +### 实现同步a + b任务异步化调度 |
| 178 | +#### 定义a+b任务 |
| 179 | +```go |
| 180 | +// AddTask add 任务结构 |
| 181 | +type AddTask struct { |
| 182 | + StartTime time.Time |
| 183 | + A, B int32 |
| 184 | +} |
| 185 | +``` |
| 186 | + |
| 187 | +#### 实现a+b任务执行器 |
| 188 | +实现一个a+b任务的执行器,支持同步任务的异步化。任务Start的时候,用一个协程后台异步执行,任务状态保存到内存中。 |
| 189 | +```go |
| 190 | +func (add *AddActuator) work(taskId string, a, b int32) { |
| 191 | + time.Sleep(time.Duration(rand.Intn(4000))*time.Millisecond + 2*time.Second) // 25% 概率超时 |
| 192 | + if _, ok := add.runningTask.Load(taskId); !ok { |
| 193 | + // 任务可能因为超时被暂停,不处理 |
| 194 | + return |
| 195 | + } |
| 196 | + newStatus := framework.AsyncTaskStatus{ |
| 197 | + TaskStatus: framework.TASK_STATUS_SUCCESS, |
| 198 | + Progress: 100.0, |
| 199 | + } |
| 200 | + add.resultMap.Store(taskId, a+b) |
| 201 | + add.runningTask.Store(taskId, newStatus) |
| 202 | +} |
| 203 | + |
| 204 | +// Start 执行任务 |
| 205 | +func (a *AddActuator) Start(ctx context.Context, ftask *framework.Task) ( |
| 206 | + newTask *framework.Task, ignoreErr bool, err error) { |
| 207 | + .... |
| 208 | + go a.work(ftask.TaskId, task.A, task.B) |
| 209 | + log.Printf("start success, taskid: %s\n", ftask.TaskId) |
| 210 | + return ftask, false, nil |
| 211 | +} |
| 212 | +``` |
| 213 | +执行器的实现参考[add_actuator.go](https://github.com/memory-overflow/light-task-scheduler/blob/main/example/add_example/add/add_actuator.go)。 |
| 214 | + |
| 215 | +#### 实现a+b任务容器 |
| 216 | +这里,我们简单的直接使用队列来作为任务容器,所以可以直接用框架预置的 queueContainer 作为任务容器,无需单独实现。 |
| 217 | + |
| 218 | +#### 实现调度 |
| 219 | +参考代码[main.go](https://github.com/memory-overflow/light-task-scheduler/blob/main/example/videocut_example/main.go) |
0 commit comments