Как в Go реализовано параллельное выполнение кода?

Пользователь

от marjorie.goldner , в категории: Вопросы от знатоков , 9 месяцев назад

Как в Go реализовано параллельное выполнение кода?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp Pocket

1 ответ

Пользователь

от francisca.kertzmann , 9 месяцев назад

@marjorie.goldner 

В Go параллельное выполнение кода осуществляется с помощью горутин (goroutines) и каналов (channels).


Горутины - это легковесные потоки выполнения, которые создаются с помощью ключевого слова go. Каждая горутина работает в отдельном потоке, но использует общую память с другими горутинами. Это позволяет создавать множество параллельных потоков выполнения с небольшими затратами на ресурсы.


Каналы - это способ обмена данными между горутинами. Каналы могут быть созданы с помощью функции make, и могут быть типизированы для передачи конкретных типов данных. Один горутина может отправлять данные в канал, а другая горутина может их принимать.


Пример параллельного выполнения кода в Go с использованием горутин и каналов:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

import (
    "fmt"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("worker", id, "processing job", j)
        time.Sleep(time.Second)
        results <- j * 2
    }
}

func main() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)

    // создаем 3 горутины-работника
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    // отправляем 9 заданий в канал
    for j := 1; j <= 9; j++ {
        jobs <- j
    }
    close(jobs)

    // получаем результаты из канала results
    for a := 1; a <= 9; a++ {
        <-results
    }
}


В этом примере мы создаем 3 горутины-работника и отправляем 9 заданий в канал. Каждый работник получает задание из канала, обрабатывает его и отправляет результат в канал results. В конце мы получаем все результаты из канала results. Как видно, работа всех горутин выполняется параллельно и синхронизируется через каналы.