2016-02-05 70 views
0

我想运行多个Go例程。我希望他们都在同一时间启动。我添加了另一个sync waitGroup,并在go例程开始时添加了一个等待。然而,这并不能使所有的例行程序在同一时间开始。我应该怎么做才能让一些例行程序同时启动?同时运行多个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() 

回答

4

你可以拥有一切够程在通道上阻止,并关闭该通道一旦被全部出动:

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) 

这将让你接近“完全相同的时间”成为可能。你不能保证它们总是在同一时间运行,如果有比GOMAXPROCS或CPU内核更多的配置,它们不可能完全同时运行。

+0

感谢您的快速响应。也感谢您的解释。 – Rmartinez