возникли проблемы при использовании goroutine в Голанге - PullRequest
0 голосов
/ 15 ноября 2018
package main

import (
    "fmt"
    //-"time"
)

func main() {
    c:=make(chan int)
    for i:=0;i<1000;i++{
        go func() {
            fmt.Println(<-c)
        }()
    }
    for j:=0;j<1000;j++{
        c<-j
        //-time.Sleep(time.Second/100)
    }
}

Когда я запускаю эту программу, она просто печатает только около ста цифр. Почему не было напечатано 1000 цифр?

Но когда я не прокомментировал код на картинке, результат стал тем, что я ожидал. Где проблема?

1 Ответ

0 голосов
/ 16 ноября 2018

Goroutines похожи на «фоновые задания» :

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

1000 процедур, ожидающих сообщения на канале 'c', работают в фоновом режиме. Основной поток отправляет 1000 сообщений на канал 'c' и немедленно завершает свою работу.

Вывод 100 или около того целых чисел будет недетерминированным, поскольку каждая из ваших 1000 процедур будет выживать только до тех пор, пока основной поток отправит 1000 целых чисел в канал 'c'. Вам нужен основной поток, чтобы дождаться окончания 1000 горутин. Попробуйте использовать sync.WaitGroup объект:

package main

import (
    "fmt"
    "sync"
    //-"time"
)

func main() {
    wg := sync.WaitGroup{}
    c:=make(chan int)
    for i:=0;i<1000;i++{
        wg.Add(1)
        go func() {
            fmt.Println(<-c)
            wg.Done()
        }()
    }
    for j:=0;j<1000;j++{
        c<-j
        //-time.Sleep(time.Second/100)
    }
    wg.Wait()
}
...