4.5-1 併發技術6:只執行一次
阿新 • • 發佈:2019-01-13
sync.Once概述
sync包下的Once物件可以保證某個函式在多工併發過程中只被執行一次
var once sync.Once
once.Do(task())
案例
- 下面的案例中,我們開闢10條協程一起追殺比爾,但保證比爾只被殺死一次
- 即Kill(bill)在併發中確保只被執行一次
package main import ( "fmt" "sync" "time" ) type Person struct { Name string Alive bool } func Kill(person *Person) { fmt.Println("殺死", person) time.After(time.Second * 3) person.Alive = false fmt.Println("比爾:啊!!!") } func main() { var wg sync.WaitGroup //宣告Once物件 var once sync.Once bill := &Person{"比爾", true} /*開闢10條協程追殺比爾*/ for i := 0; i < 10; i++ { wg.Add(1) go func() { //保證Kill(bill)只執行一次 once.Do(func() { Kill(bill) }) wg.Done() }() } wg.Wait() fmt.Println("main over") }
我們起了10條協程,而實際的執行效果是