@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. Как видно, работа всех горутин выполняется параллельно и синхронизируется через каналы.