package main
import (
"fmt"
"sync"
"time"
)
func main() {
longTimeAct := func(index int, w chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
time.Sleep(1 * time.Second)
fmt.Println(time.Now())
fmt.Println(index)
<-w
}
wg := new(sync.WaitGroup)
ws := make(chan struct{}, 3)
for i := 0; i < 100; i++ {
ws <- struct{}{}
wg.Add(1)
go longTimeAct(i, ws, wg)
}
wg.Wait()
}
非常精巧的代码,其中管道是用来保证并发次数的,而waitgroup看似是多余的,其实作用很重要的,保证每个任务能够正常的结束。