Каким будет поток выполнения данного кода? А также, как будут выполняться подпрограммы? - PullRequest
1 голос
/ 04 ноября 2019

(Новое в параллельном программировании) У вас были сомнения по поводу того, почему поток выполнения goroutines немного странный?

Начинающий изучать горутины и каналы на Голанге.

func main() {
    // Set up the pipeline.
    c := gen(2, 3)
    out := sq(c)

    // Consume the output.
    fmt.Println(<-out) // 4
    fmt.Println(<-out) // 9
}

func sq(in <-chan int) <-chan int {
    out := make(chan int)
    go func() {
        for n := range in {
            out <- n * n
        }
        close(out)
    }()
    return out
}

func gen(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        for _, n := range nums {
            out <- n
        }
        close(out)
    }()
    return out
}

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

enter image description here

Надеюсь, это поможет. Это схема трубопроводов. Итак, есть три программы и два канала

2 голосов
/ 04 ноября 2019

После завершения вызовов gen и sq одновременно выполняются 3 программы. Они передают данные между каналами и, следовательно, выполнение дает одинаковые результаты.

  1. gen-inner
  2. sq-inner
  3. main

Они всегда пропускают как минимум 2 фрагмента информации и поэтому запускают свой код в следующем порядке:

  1. gen-inner out <- n -2-> sq-inner out <- n * n -4->main println(<-out)
  2. gen-inner out <- n -3-> sq-inner out <- n * n -9-> main println(<-out)

Существует также третий проход, которыйможет случиться, но может быть пропущен, так как main конец программы.

gen-inner close() -close-> sq-inner close(out) -close ->
...