func New(workers, queue, int) Scheduler { s := &scheduler { queue := make(chan Task, queue) for i := 0; i < workers; i++ { wg.Add(1) go func() { defer wg.Done() for task := range s.queue { task.Do() } }() } } return s } func (s *scheduler) Close() { close(s.queue) s.wg.Wait() } type Task interface { Do() }
Answer from AI
sobes.tech AI
В представленном коде есть несколько ошибок и неточностей, которые стоит исправить для корректной работы планировщика задач (Scheduler) с воркерами и очередью.
-
В сигнатуре функции
New(workers, queue, int) Schedulerневерно указан тип параметров — нужно явно указать типы для каждого параметра, например:New(workers int, queue int) Scheduler. -
В инициализации структуры
schedulerиспользуется синтаксисqueue := make(chan Task, queue), что является объявлением новой переменной, а не инициализацией поля структуры. Правильно будет использоватьqueue: make(chan Task, queue),. -
Отсутствует объявление
wg(WaitGroup) в структуреschedulerи его инициализация. -
В горутине, которая запускается для каждого воркера, используется
s.queue, ноsеще не полностью инициализирован, что может привести к ошибкам. -
Отсутствует определение типа
schedulerи интерфейсаScheduler.
Пример исправленного и упрощённого варианта:
package main
import (
"sync"
)
type Task interface {
Do()
}
type Scheduler interface {
Schedule(task Task)
Close()
}
type scheduler struct {
queue chan Task
wg sync.WaitGroup
}
func New(workers int, queueSize int) Scheduler {
s := &scheduler{
queue: make(chan Task, queueSize),
}
s.wg.Add(workers)
for i := 0; i < workers; i++ {
go func() {
defer s.wg.Done()
for task := range s.queue {
task.Do()
}
}()
}
return s
}
func (s *scheduler) Schedule(task Task) {
s.queue <- task
}
func (s *scheduler) Close() {
close(s.queue)
s.wg.Wait()
}
В этом примере:
Newсоздаёт планировщик с заданным числом воркеров и размером очереди.- Каждый воркер читает задачи из канала
queueи выполняет методDo(). - Метод
Scheduleдобавляет задачи в очередь. - Метод
Closeзакрывает очередь и ждёт завершения всех воркеров.
Такой подход позволяет эффективно распараллелить выполнение задач с контролем завершения всех горутин.