# #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()
}