То, что я в конечном итоге хочу выполнить, - это динамически увеличивать или уменьшать моих работников в зависимости от рабочей нагрузки.
Приведенный ниже код успешно анализирует данные, когда Задача проходит через w.Channel
func (s *Storage) StartWorker(w *app.Worker) {
go func() {
for {
w.Pool <- w.Channel // register current worker to the worker pool
select {
case task := <-w.Channel: // received a work request, do some work
time.Sleep(task.Delay)
fmt.Println(w.WorkerID, "processing task:", task.TaskName)
w.Results <- s.ProcessTask(w, &task)
case <-w.Quit:
fmt.Println("Closing channel for", w.WorkerID)
return
}
}
}()
}
Точкой блокировки здесь является строка ниже.
w.Pool <- w.Channel
В этом смысле, если я пытаюсь остановить работника (-ов) в любой части моей программы с помощью:
w.Quit <- true
case <-w.Quit:
блокируется и никогда не получает доесть еще одна входящая задача на w.Channel (и я предполагаю, что оператор выбора здесь является случайным для каждого выбора случая).
Так как я могу остановить канал (рабочий) независимо?