多個goroutine并發執行時,每一個goroutine搶到處理器的時間點不一致,gorouine的執行本身不能保證順序。即代碼中先寫的gorouine并不能保證先執行
思路:使用channel進行通信通知,用channel去傳遞信息,從而控制并發執行順序
package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc main() {ch1 := make(chan struct{}, 1)ch2 := make(chan struct{}, 1)ch3 := make(chan struct{}, 1)ch1 <- struct{}{}wg.Add(3)start := time.Now().Unix()go print("gorouine1", ch1, ch2)go print("gorouine2", ch2, ch3)go print("gorouine3", ch3, ch1)wg.Wait()end := time.Now().Unix()fmt.Printf("duration:%d\n", end-start)
}func print(gorouine string, inputchan chan struct{}, outchan chan struct{}) {// 模擬內部操作耗時time.Sleep(1 * time.Second)select {case <-inputchan:fmt.Printf("%s\n", gorouine)outchan <- struct{}{}}wg.Done()
}
- 輸出:
gorouine1
gorouine2
gorouine3
duration:1
本文節選于Go合集《常見面試題匯總》:GOLANG ROADMAP 一個專注Go語言學習、求職的社區。