Files
slide/decks/gen2D/pages/async-deep-dive.md
T
wonder f3abc5fdc6
Deploy Slides / build-and-deploy (push) Successful in 1m39s
fix: split overflowing slides to fit frankfurt theme header/footer bars
- eino-deep-dive.md: split slide 2 into code-only + explanation+SVG slides
- async-deep-dive.md: split slide 2 into code-only + progress+SVG slides
- harness.md: split slide 2 (4 Items + SVG) into two slides (2 Items each)
- request-journey.md: split into middleware/handler + pipeline/finalization slides

The frankfurt theme header (~40px) overlaps ~7px into the content zone,
leaving ~467px effective height. Dense slides with code+Items+images
exceeded this budget and were hidden behind the bars.
2026-05-31 00:01:33 +08:00

80 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 异步任务 — 队列与调度
FIFO 串行执行,信号驱动调度
<div class="grid grid-cols-2 gap-4 mt-2">
<div>
```go {1-6|8-12|all}
type TaskQueue struct {
mu sync.Mutex
jobs []*TaskJob
ready chan struct{} // 新任务到达信号
stop chan struct{} // 优雅关闭信号
}
func (q *TaskQueue) Enqueue(job *TaskJob) {
q.mu.Lock()
q.jobs = append(q.jobs, job)
q.mu.Unlock()
q.ready <- struct{}{} // 唤醒 run() 协程
}
```
</div>
<div class="flex flex-col justify-center">
<v-clicks>
<Item title="Enqueue → run() → processNext() 流程">
提交任务入队并发送信号。`run()` 协程阻塞等待信号,收到后调用 `processNext()` 取队首任务执行。FIFO 保证任务按提交顺序串行处理。
</Item>
<Item title="每个 Job 是一个闭包">
`TaskJob` 封装了 `context.Context` 和执行函数。闭包捕获任务参数,context 控制超时和取消,确保每个任务独立且可中断。
</Item>
</v-clicks>
</div>
</div>
---
# 进度推送与 WebSocket
Context 注入 + 多通道推送
```go {1-3|5-8|all}
func WithProgressReporter(ctx context.Context, r ProgressReporter) context.Context {
return context.WithValue(ctx, progressCtxKey, r)
}
// 管线节点中使用
reporter := GetProgressReporter(ctx)
reporter.Report(Progress{Stage: "prompt", Percent: 25})
```
---
# 进度推送 — 阶段与通道
<v-clicks>
<Item title="进度阶段划分">
5%(任务创建)→ 25%(提示词优化完成)→ 60%(素材生成完成)→ 80%(质检通过)→ 100%(格式适配 + 上传)。每个阶段由对应节点触发回调。
</Item>
<Item title="双通道推送">
**WebSocket**:`ws://host/api/v1/tasks/:taskId/ws`,实时推送进度和结果。**HTTP 轮询**:`GET /api/v1/tasks/:taskId`,兼容降级方案。
</Item>
</v-clicks>
<div class="flex justify-center mt-2">
<img src="../public/async-task.svg" class="w-full max-h-[200px] object-contain" />
</div>