工作用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

目录
相关文章
|
6月前
|
Go
go的并发初体验、加锁、异步
go的并发初体验、加锁、异步
|
2月前
|
安全 编译器 Go
Go runtime 调度器精讲(十):异步抢占
Go runtime 调度器精讲(十):异步抢占
|
4月前
|
Go 数据库 UED
[go 面试] 同步与异步:程序执行方式的不同之处
[go 面试] 同步与异步:程序执行方式的不同之处
|
4月前
|
存储 Go 调度
go-zero 如何应对海量定时/延迟任务?
go-zero 如何应对海量定时/延迟任务?
|
6月前
|
并行计算 Go 数据处理
掌握Go语言:Go 并发编程,轻松应对大规模任务处理和高并发请求(34)
掌握Go语言:Go 并发编程,轻松应对大规模任务处理和高并发请求(34)
|
6月前
|
Go
go之channel任意任务完成、全部任务完成退出
go之channel任意任务完成、全部任务完成退出
|
7月前
|
NoSQL Go Redis
Go异步任务处理解决方案:Asynq
Go异步任务处理解决方案:Asynq
305 1
Go异步任务处理解决方案:Asynq
|
消息中间件 运维 Kubernetes
工作中用Go: Go中异步任务怎么写
工作中用Go: Go中异步任务怎么写
3059 0
工作中用Go: Go中异步任务怎么写
|
7月前
|
Go 开发者
Go语言带缓冲通道:异步通信的艺术
Go语言带缓冲通道:异步通信的艺术
65 0
|
监控 NoSQL 数据可视化
一文带您了解Go异步任务处理解决方案:Asynq
一文带您了解Go异步任务处理解决方案:Asynq
548 0