同时运行多个go例程

时间:2016-02-05 22:16:57

标签: go

我想运行多个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()

1 个答案:

答案 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,它们可能无法在完全相同的时间运行。