Files
slide/decks/gen2D/pages/async-deep-dive.md
T
wonder 5f99d2481a style: optimize gen2D deck layout, animations, and visual hierarchy
- style-keys.md: add v-clicks to 3x2 grid for staggered animation
- eino-graph.md: two-column layout (code left, Items right)
- eino-deep-dive.md: two-column layout for both slides, code+Items side-by-side
- async-deep-dive.md: two-column layout for both slides, SVG integrated
- harness.md: two-column layout for slide 1 (code left, Items right)
- request-journey.md: two-column layout for journey steps
- data-model.md: add v-clicks to grid items, increase diagram height
- architecture/pipeline/prompt-agent: increase SVG max-height for better visibility
2026-05-30 23:13:23 +08:00

2.0 KiB
Raw Blame History

异步任务 — 队列与调度

FIFO 串行执行,信号驱动调度

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() 协程
}
提交任务入队并发送信号。`run()` 协程阻塞等待信号,收到后调用 `processNext()` 取队首任务执行。FIFO 保证任务按提交顺序串行处理。 `TaskJob` 封装了 `context.Context` 和执行函数。闭包捕获任务参数,context 控制超时和取消,确保每个任务独立且可中断。

进度推送与 WebSocket

Context 注入 + 多通道推送

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})
5%(任务创建)→ 25%(提示词优化完成)→ 60%(素材生成完成)→ 80%(质检通过)→ 100%(格式适配 + 上传)。每个阶段由对应节点触发回调。 **WebSocket**:`ws://host/api/v1/tasks/:taskId/ws`,实时推送进度和结果。**HTTP 轮询**:`GET /api/v1/tasks/:taskId`,兼容降级方案。