параллелизм go печатает последовательно

# #go #concurrency

Вопрос:

я пытаюсь печатать одновременно, но не могу понять, почему его серийный номер, поместил код ниже

 package main

import (
        "fmt"
        "sync"
)

func main() {
        fmt.Println("Hello, playground")
        var wg sync.WaitGroup
        wg.Add(2)
    go func(){
        for i := 0; i < 4; i   {
                if i%2 == 0 {
                        fmt.Println("hi", i)
                }
        }
         wg.Done()
       }()
        go func() {

                for i := 0; i < 4; i   {
                        if i%2 != 0 {
                                fmt.Println("g", i)
                        }

                }
                wg.Done()
        }()
        wg.Wait()
}
 

ожидание равно
hi0
g1
hi2
g3

но я понимаю

от g 1 от g 3 привет 0 привет 2

Комментарии:

1. Ваш первый цикл печати выполняется и завершается до запуска goroutine.

2. спасибо , но даже после этого все равно параллельно @bereal один печатает оба, а другой нет play.golang.org/p/vRV3lRs3RQ_w

3. Кроме того, такая небольшая функция с меньшей вероятностью продемонстрирует параллелизм, потому что первая функция goroutine может завершиться даже до запуска второй или до переключения контекста. Попробуйте добавить, например time.Sleep(100*time.Millisecond) , в цикл.

4. По определению относительный порядок выполнения параллельных процессов не определен . Вы не должны делать никаких предположений на этот счет.

Ответ №1:

Такая небольшая функция с меньшей вероятностью продемонстрирует параллелизм, поскольку первая подпрограмма может завершиться еще до запуска второй или до того, как произойдет переключение контекста. Если вы добавите небольшую паузу в цикл, вы увидите чередование:

 package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    go func() {
        for i := 0; i < 4; i   {
            if i%2 == 0 {
                fmt.Println("hi", i)
            }
            time.Sleep(10 * time.Millisecond)
        }
        wg.Done()
    }()
    go func() {
        for i := 0; i < 4; i   {
            if i%2 != 0 {
                fmt.Println("from g", i)
            }
            time.Sleep(10 * time.Millisecond)

        }
        wg.Done()
    }()
    wg.Wait()
}