49 lines
1.0 KiB
Go
49 lines
1.0 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
|
|
"time"
|
|
)
|
|
|
|
// context.WithValue
|
|
|
|
type TraceCode string
|
|
|
|
var wait sync.WaitGroup
|
|
|
|
func workerProc(ctx context.Context) {
|
|
key := TraceCode("TRACE_CODE")
|
|
traceCode, ok := ctx.Value(key).(string) // 在子goroutine中获取trace code
|
|
if !ok {
|
|
fmt.Println("invalid trace code")
|
|
}
|
|
LOOP:
|
|
for {
|
|
fmt.Printf("worker, trace code:%s\n", traceCode)
|
|
time.Sleep(time.Millisecond * 10) // 假设正常连接数据库耗时10毫秒
|
|
select {
|
|
case <-ctx.Done(): // 50毫秒后自动调用
|
|
break LOOP
|
|
default:
|
|
}
|
|
}
|
|
fmt.Println("worker done!")
|
|
wait.Done()
|
|
}
|
|
|
|
func main() {
|
|
// 设置一个50毫秒的超时
|
|
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*50)
|
|
// 在系统的入口中设置trace code传递给后续启动的goroutine实现日志数据聚合
|
|
ctx = context.WithValue(ctx, TraceCode("TRACE_CODE"), "12512312234")
|
|
wait.Add(1)
|
|
go workerProc(ctx)
|
|
time.Sleep(time.Second * 5)
|
|
cancel() // 通知子goroutine结束
|
|
wait.Wait()
|
|
fmt.Println("over")
|
|
}
|