我想运行多个Go例程。我希望他们都能在同一时间启动。我添加了另一个同步waitGroup,并在go例程的开始内添加了一个等待。然而,这并不能让所有的例程同时开始。我应该怎么做才能让一些例程同时开始?
package main
import (
"flag"
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
routines := flag.Int("runs", 100, "routines running")
flag.Parse()
wg.Add(*routines)
for i := 0; i < *routines; i++ {
go func() {
defer wg.Done()
t := time.Now()
fmt.Printf("%s\n", t)
}()
}
fmt.Println("Waiting To Finish")
wg.Wait()
答案 0 :(得分:11)
您可以让所有goroutine在一个频道上阻止,并在所有频道全部发送后关闭该频道:
start := make(chan struct{})
for i := 0; i < *routines; i++ {
go func() {
<-start
defer wg.Done()
t := time.Now()
fmt.Printf("%s\n", t)
}()
}
fmt.Println("starting")
close(start)
这将使你接近&#34;完全相同的时间&#34;尽可能。您无法确保它们始终在同一时间运行,并且如果有比GOMAXPROCS或CPU核心更多的goroutine,它们可能无法在完全相同的时间运行。