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
}
}
输出结果:
jsOnly once
jspackage 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 许可协议。转载请注明出处!