Неверные значения с примером параллелизма - PullRequest
0 голосов
/ 02 июня 2018

Я работаю через электронную книгу и здесь я делаю этот код:

func f(n int) {
  for i := 0; i < 10; i++ {
    fmt.Println(n, ":", i)
    amt := time.Duration(rand.Intn(250))
    time.Sleep(time.Millisecond * amt)
  }
}

func ConcurrMain() {
  for i := 0; i < 10; i++ {
    go f(i)
  }
  fmt.Println("hi")
}

Проблема в том, что я получаю разные значения с каждой командой запуска через goclipse.Кажется, это работает лучше, когда я не выполняю команду сна.

В любом случае любое объяснение с пошаговым описанием, которое я думал, будет полезным в моем изучении параллелизма

Вот примермое возвращаемое значение со временем сна:

4 : 0
1 : 0
6 : 0
0 : 0
5 : 0
7 : 0
8 : 0
2 : 0
3 : 0
9 : 0
9 : 1
hi

Затем я запускаю его снова и теперь получаю со временем сна:

0 : 0
hi
1 : 0

А теперь в третий раз, и я получаю со временем сна:

0 : 0
hi

И на этот раз без сна я получаю:

1 : 0
1 : 1
1 : 2
1 : 3
1 : 4
1 : 5
1 : 6
1 : 7
1 : 8
3 : 0
3 : 1
4 : 0
4 : 1
4 : 2
9 : 0
6 : 0
6 : 1
6 : 2
2 : 0
2 : 1
2 : 2
2 : 3
2 : 4
2 : 5
2 : 6
2 : 7
2 : 8
2 : 9
7 : 0
7 : 1
7 : 2
7 : 3
7 : 4
7 : 5
7 : 6
5 : 0
5 : 1
5 : 2
5 : 3
5 : 4
5 : 5
5 : 6
5 : 7
5 : 8
5 : 9
9 : 1
1 : 9
8 : 0
3 : 2
hi

Я использую goclipse под окнами на случай, если информация уместна

ОБНОВЛЕНИЕ

Следует отметить, что этот вызов вызывается из основного пакета как:

func main()
{
   lab.ConcurrMain()
}

ОБНОВЛЕНИЕ2

Я добавил: var wg sync.WaitGroup outside the func scope. I also added wg.Add (1) inside the ConcurrMain method just prior to go f (i) , then i also added wg.Wait () just after the forloop, который выполняет функцию go and then finally wg.Done () inside the f () `метод ** и это, кажется, работает, но этот ответ не был в электронной книге, поэтому я хочу понять.

1 Ответ

0 голосов
/ 03 июня 2018

На ходу программа работает только до тех пор, пока работает ее основная программа.То есть программа, которая первоначально запускает основную функцию, если она завершается, завершается вся программа.

В приведенном вами примере (фрагмент кода) нет ничего, что могло бы принуждать при Запланированные и запущенные вами подпрограммы ConcurrMain.Прежде чем вы добавите sync.WaitGroup, основная программа может выйти до того, как запланированы дополнительные программы.

Если основная программа завершается, программа завершается, а остальные программы не выполняются.Основная программа не будет ждать других программ, если вы специально не попросите об этом с группой ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...