1. sleep (不建议)
func main() {
go watch()
go doIt()
time.Sleep(time.Second * 10)
}
func watch(wg *sync.WaitGroup) {
for i := 0; i < 10; i++ {
n := rand.Intn(3)
time.Sleep(time.Duration(n) * time.Second)
fmt.Printf("watch: %v \n", i)
}
}
func doIt(wg *sync.WaitGroup) {
for i := 0; i < 10; i++ {
n := rand.Intn(3)
time.Sleep(time.Duration(n) * time.Second)
fmt.Printf("doIt: %v \n", i)
}
}
2. waitgroup (推荐)
func main() {
var wg sync.WaitGroup
wg.Add(2)
go watch(&wg)
go look(&wg)
wg.Wait()
}
func watch(wg *sync.WaitGroup) {
for i := 0; i < 10; i++ {
n := rand.Intn(3)
time.Sleep(time.Duration(n) * time.Second)
fmt.Printf("watch: %v \n", i)
}
wg.Done()
}
func look(wg *sync.WaitGroup) {
for i := 0; i < 10; i++ {
n := rand.Intn(3)
time.Sleep(time.Duration(n) * time.Second)
fmt.Printf("look: %v \n", i)
}
wg.Done()
}
3. channel (推荐)
func main() {
output1 := make(chan string)
output2 := make(chan string)
go server1(output1)
go server2(output2)
select {
case s1 := <-output1:
fmt.Println("执行完成")
case s2 := <-output2:
fmt.Println("执行完成")
}
}
func server1(ch chan string) {
time.Sleep(1 * time.Second)
ch <- "from server1"
}
func server2(ch chan string) {
time.Sleep(1 * time.Second)
ch <- "from server2"
}