2024-10-180

sync

通过sync使程序只执行一次

golang
package main import ( "fmt" "sync" ) func main() { var once sync.Once onceBody := func() { fmt.Println("Only once") } done := make(chan bool) // 创建 10 个 goroutine,但是 onceBody 只会执行 1 次 for i := 0; i < 10; i++ { go func() { once.Do(onceBody) done <- true }() } // 等待 10 个 goroutine 结束 for i := 0; i < 10; i++ { <-done } }

输出结果:

js
Only once

如何通过select 和ticker配合定时执行任务

js
package main import ( "context" "fmt" "sync" "time" ) func runTask(ctx context.Context, wg *sync.WaitGroup, name string, interval time.Duration) { defer wg.Done() ticker := time.NewTicker(interval) defer ticker.Stop() for { select { case <-ticker.C: fmt.Println("run task", name, time.Now()) case <-ctx.Done(): fmt.Println("stop task", name) return } } } func main() { ctx, cancel := context.WithCancel(context.Background()) var wg sync.WaitGroup wg.Add(2) go runTask(ctx, &wg, "task1", time.Second*3) go runTask(ctx, &wg, "task2", time.Second*9) time.Sleep(time.Second * 20) cancel() wg.Wait() fmt.Println("exit") }

本文作者:曹子昂

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!