Для отправки команды ожидания в пул воркеров в языке программирования Go можно использовать шаблон работы с пулом воркеров с использованием паттерна "пул процессов". В этом шаблоне есть два основных компонента: пул воркеров и каналы для коммуникации между пулом и модулями, отправляющими задания.
Для начала создадим структуру, представляющую воркера:
type Worker struct { ID int Task chan Task Result chan Result Quit chan struct{} }
В этой структуре мы определили ID для идентификации воркера, канал Task для получения задач, канал Result для отправки результата работы и канал Quit для выхода из пула воркеров.
Теперь создадим структуру, представляющую задание:
type Task struct { // Поля задачи }
Создадим функцию, которую будут выполнять воркеры:
func worker(id int, taskCh <-chan Task, resultCh chan<- Result, quitCh <-chan struct{}) { for { select { case task := <-taskCh: // Обработка задачи result := ... // Выполнение задачи resultCh <- result case <-quitCh: return } } }
В функции worker мы используем select, чтобы обрабатывать различные каналы. Когда поступает задание из канала taskCh, воркер выполняет обработку задачи и отправляет результат в канал resultCh. Если поступает сигнал на завершение работы из канала quitCh, воркер завершает свою работу.
Теперь можем создать пул воркеров:
type Pool struct { Workers []*Worker JobQueue chan Task Results chan Result } func NewPool(poolSize, jobQueueSize, resultQueueSize int) *Pool { pool := &Pool{ JobQueue: make(chan Task, jobQueueSize), Results: make(chan Result, resultQueueSize), } for i := 0; i < poolSize; i++ { worker := &Worker{ ID: i, Task: make(chan Task), Result: pool.Results, Quit: make(chan struct{}), } pool.Workers = append(pool.Workers, worker) go worker.worker() } return pool }
В функции NewPool мы создаем пул воркеров указанного размера. Каждый воркер создается с отдельным ID, каналами для задач (Task), результатов (Result) и завершения работы (Quit).
Теперь можно отправить команду ожидания в пул воркеров:
func main() { pool := NewPool(10, 100, 100) // Создание и отправка задач в пул task := Task{ // Задача } pool.JobQueue <- task // Ожидание результатов result := <-pool.Results // Обработка результата }
В функции main мы создаем пул воркеров, создаем задачу и отправляем ее в пул через канал JobQueue. Затем ожидаем результат выполнения задачи из канала Results и обрабатываем его.
Таким образом, мы создали пул воркеров, который может принимать задачи через канал, выполнять их и возвращать результаты через другой канал. Отправка команды ожидания заключается в отправке задачи в пул и ожидании ее выполнения и получения результата.