2016-02-05 66 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