Конкурентность в Go

Go Worker Pool

Share a queue of jobs between a fixed number of goroutines to limit how much runs at once.

  • Продвинутый
  • Чтение: 4 мин
  • Примеров для запуска: 1
Что вы узнаете
  • A jobs channel
  • Several workers
  • Closing results safely
6 jobs, 3 workers
  1. 1jobs1 2 3 4 5 6
  2. 23 workersn * n
  3. 3results1 4 9 16 25 36

A fixed team of workers

A worker pool starts a fixed number of goroutines that all read jobs from one channel. It limits how much work runs at the same time, which protects memory, files and network connections.

Three workers read from jobs until it is closed and send each answer to results. A separate goroutine closes results after every worker has finished, which ends the final range loop. Each result carries its job number, so the order in which workers finish does not matter.

Главное

  1. All workers read from one jobs channel.
  2. close(jobs) tells them to stop.
  3. Results are closed after every worker is done.

Пример на Go, который можно запустить

Go
Запустить код →
main.go
package main

import (
	"fmt"
	"sync"
)

func worker(jobs <-chan int, results chan<- [2]int, wg *sync.WaitGroup) {
	defer wg.Done()
	for n := range jobs {
		results <- [2]int{n, n * n}
	}
}

func main() {
	jobs := make(chan int)
	results := make(chan [2]int)
	var wg sync.WaitGroup

	for w := 0; w < 3; w++ {
		wg.Add(1)
		go worker(jobs, results, &wg)
	}

	go func() {
		for n := 1; n <= 6; n++ {
			jobs <- n
		}
		close(jobs)
	}()
	go func() {
		wg.Wait()
		close(results)
	}()

	squares := make([]int, 7)
	for result := range results {
		squares[result[0]] = result[1]
	}
	fmt.Println(squares[1:])
}
Получить кнопку запуска для этого примера Результат выполнения
[1 4 9 16 25 36]

Практика

Откройте пример в онлайн-компиляторе, измените значение или добавьте строку и попробуйте предсказать вывод до запуска. Затем намеренно сломайте код и прочитайте сообщение компилятора.

Закончили этот урок?

Отметьте его как изученный, чтобы следить за прогрессом.

Далее: Context: Cancellation and Deadlines →

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи