2017-01-03 2 views
1

Я написал goroutine внутри для цикла, как следует. Я хочу выполнить goroutine для каждого элемента в списке listDevices одновременно, но эта логика запускает goroutine только для одного элемента в списке listDevices.Параллельные goroutines внутри петли for

for _, ip := range listOfDevices { 
      inChan <- types.NewNotification(time.Now(), "/cloudtracer/status", nil, 
        &map[key.Key]interface{}{ 
          key.New(ip): types.Pointer{Pointer: "/cloudtracer/status/" + ip}, 
        }) 
      pingOneMachine := probe.NewPing(ip, 2*time.Second, inChan) 
      // For now stopping the probe after few minutes. This will change later 
      ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) 
      defer cancel() 

      wg.Add(len(listOfDevices)) 
      go func() { 
        defer wg.Done() 
        pingOneMachine.Run(ctx) 
      }() 
    } 
    wg.Wait() 

Может ли кто-нибудь помочь мне в исправлении этого? благодарит заранее.

+7

'wg.Add (len (listOfDevices))' в цикле кажется неправильным, переместите его перед циклом. Или замените его на 'wg.Add (1)'. – ain

+2

Что такое дюйм определено как? Это буферный канал или канал с постоянным считывателем? – kca

+0

Похоже, что inchan имеет емкость 1, играйте с большими значениями. –

ответ

-1

сделать это как следующий

for ;;{ 
     wg.Add(1) 
     go func(){ 
      defer wg.Done() 
     } 
    } 
    wg.Wait() 
+0

Он тоже не работает. – supriya

0

Попробуйте использовать goroutine закрытия:

  go func(c context.Context) { 
        defer wg.Done() 
        pingOneMachine.Run(c) 
      }(ctx) // pass in the lexically scoped variable here 

То есть, имя переменной ctx в настоящее время переопределен в течение цикла, прежде чем она используется в goroutine (поскольку переменные лексически ограничены), см. этот вопрос для приятного объяснения Why does Golang handle closures differently in goroutines?

В основном переменные передаются по ссылке:

Это означает, что любые переменные, на которые ссылается замыкание из «внешней» области, не являются копией, но на самом деле являются ссылкой.

0
for ;;{ 
    wg.Add(1) 
    go func(ip string){ 
     defer wg.Done() 
    }(ip) 
} 
wg.Wait() 

Он работал в создании параллельных goroutines для всех IP-адресов.

Смежные вопросы