40 lines
661 B
Go
40 lines
661 B
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"sync"
|
||
|
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
// context.WithTimeout
|
||
|
|
||
|
var Wg sync.WaitGroup
|
||
|
|
||
|
func worker(ctx context.Context) {
|
||
|
LOOP:
|
||
|
for {
|
||
|
fmt.Println("db connecting ...")
|
||
|
time.Sleep(time.Millisecond * 10) // 假设正常连接数据库耗时10毫秒
|
||
|
select {
|
||
|
case <-ctx.Done(): // 50毫秒后自动调用
|
||
|
break LOOP
|
||
|
default:
|
||
|
}
|
||
|
}
|
||
|
fmt.Println("worker done!")
|
||
|
Wg.Done()
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
// 设置一个50毫秒的超时
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*50)
|
||
|
Wg.Add(1)
|
||
|
go worker(ctx)
|
||
|
time.Sleep(time.Second * 5)
|
||
|
cancel() // 通知子goroutine结束
|
||
|
Wg.Wait()
|
||
|
fmt.Println("over")
|
||
|
}
|