工作用Go: 异步任务怎么写5 | 异步任务: 能否更优雅点

简介: 工作用Go: 异步任务怎么写5 | 异步任务: 能否更优雅点

go01.jpeg

本文为 工作用Go: 异步任务怎么写 系列的第5


如果是从请求过来的, 请求中自带 trace, 并会在请求(request)的初始化的时候建 trace 写入到请求的 ctx 中, 那如果直接执行一个异步任务呢?


那就需要手动初始化 trace 了.


上代码:

  • 封装异步任务(job): 封装trace -> clone ctx -> 指标收集(jobMetricsWrap) -> 野生Goroutine捕获
packagejob// AsyncJob 异步任务。// name: 任务名。// return: waitFunc,调用可以等待任务完成。funcAsyncJob(ctxcontext.Context, namestring, fnfunc(ctxcontext.Context) error, opts...Option) func() {
ctx=tel_in.CtxAdjuster(ctx) // 初始化 tracenewCtx :=ctxkit.Clone(ctx)
wg :=sync.WaitGroup{}
wg.Add(1)
gofunc() {
deferwg.Done()
// 指标收集jobMetricsWrap(newCtx, fn, applyOption(name, true, opts...))
 }()
returnwg.Wait}


  • 实际使用:
func TestJob(t *testing.T) {
 ctx := context.Background()
 // 异步任务
 // 逻辑在协程中执行,已包装 recover 逻辑
 wait := job.AsyncJob(ctx, "your_task_name", func(ctx context.Context) error {
  // 内部处理使用传入的 ctx,已经执行过 citkit.Clone
  return doAsyncTask(ctx)
 })
 wait() // 如果需要等待任务结束则调用 wait,不需要则忽略返回值
}
func doAsyncTask(ctx context.Context) error {
 logs.InfoCtx(ctx, "async task done")
 return nil
}
=== RUN   TestJob
2022-11-18T10:18:39.014+0800 INFO tests/async_job_test.go:250 async task done {"traceId": "0a9599556376eb7fd7fb497adacbf712"}
--- PASS: TestJob (0.00s)
PASS


PS: 这里需要查看效果, 所以调用了 wait() 等待异步任务结束, 实际使用可以直接使用 job.AsyncJob() 或者 _ = job.AsyncJob()


最后一起来看看 trace 使用的效果:

  • 可以清晰看到所有记录到 trace 中的调用
  • 可以直观的看到原请求的耗时和异步任务的耗时
  • 耗时较长会 红色 显示出来

trace_job.png

目录
相关文章
|
5月前
|
NoSQL Go Redis
Go异步任务处理解决方案:Asynq
Go异步任务处理解决方案:Asynq
205 1
Go异步任务处理解决方案:Asynq
|
消息中间件 运维 Kubernetes
工作中用Go: Go中异步任务怎么写
工作中用Go: Go中异步任务怎么写
1846 0
工作中用Go: Go中异步任务怎么写
|
10月前
|
监控 NoSQL 数据可视化
一文带您了解Go异步任务处理解决方案:Asynq
一文带您了解Go异步任务处理解决方案:Asynq
360 0
|
运维 Prometheus Kubernetes
工作用Go: 异步任务怎么写6 | Asynq: 专业异步任务框架
工作用Go: 异步任务怎么写6 | Asynq: 专业异步任务框架
1700 0
工作用Go: 异步任务怎么写6 | Asynq: 专业异步任务框架
|
消息中间件 监控 NoSQL
工作用Go: 异步任务怎么写4 | Trace: 异步任务还能进行链路追踪么?
工作用Go: 异步任务怎么写4 | Trace: 异步任务还能进行链路追踪么?
436 0
工作用Go: 异步任务怎么写4 | Trace: 异步任务还能进行链路追踪么?
|
Go
工作用Go: 异步任务怎么写3 | 避坑: 野生 Goroutine
工作用Go: 异步任务怎么写3 | 避坑: 野生 Goroutine
286 0
工作用Go: 异步任务怎么写3 | 避坑: 野生 Goroutine
|
5天前
|
人工智能 Go 调度
掌握Go并发:Go语言并发编程深度解析
掌握Go并发:Go语言并发编程深度解析
|
2天前
|
存储 Go
用Go语言实现一个单协程消费者模型
用Go语言实现一个单协程消费者模型
13 0
|
2天前
|
编译器 Go C语言
一文速通Go语言面向对象编程
一文速通Go语言面向对象编程
9 0
|
2天前
|
Java 编译器 Go
一文速通go语言类型系统
一文速通go语言类型系统
8 0