Skip to content

Commit 7c86866

Browse files
author
willzhen
committed
Update readme
1 parent 799786d commit 7c86866

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

readme.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
- [实现视频裁剪任务执行器](#实现视频裁剪任务执行器)
1212
- [实现视频裁剪任务容器](#实现视频裁剪任务容器)
1313
- [实现调度](#实现调度)
14+
- [实现同步a + b任务异步化调度](#实现同步a--b任务异步化调度)
15+
- [定义a+b任务](#定义ab任务)
16+
- [实现a+b任务执行器](#实现ab任务执行器)
17+
- [实现a+b任务容器](#实现ab任务容器)
18+
- [实现调度](#实现调度-1)
1419

1520
# 轻量级任务调度框架
1621

@@ -167,3 +172,48 @@ func main() {
167172
}
168173
}
169174
```
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

Comments
 (0)