kvaks
@kvaks

Как в GO pool worker остановить горутины?

Собственно есть хороший пример pool worker подскажите как остановить все запущенные горутины?
понимаю, что создать еще один канал и и по нему закрыть, но не получается.
  • Вопрос задан
  • 683 просмотра
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Доработать worker pool:

Внутри каждой горутины слушать ctx.Done из context.context, который вы передадите в каждую рутину, кроме того еще создать cancel() функцию, которую вы будете вызывать в случае если вам надо...

При вызове данной функции все горутины получат уведомление в select и завершатся.

Как будет выглядеть горутина: бесконечный цикл, внутри селект на ваш канал с jobs и на ctx.Done(), если ctx.Done() не пришел (вызван будет например ошибкой в др местах), то будет читаться канал с джобами, но если придет ctx.Done() , то делать return

for {
     select {
     case job := <-jobs:
            // work with job
     case <-ctx.Done():
          c.logger.Errorf("shutdown cancelled: %v", ctx.Err())
          return // выход из горутины
      }
     }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@deliro
Закрытие канала jobs делает выход из цикла for j := range jobs, функция заканчивается, горутина убивается. В чём вопрос?
Ответ написан
WinPooh32
@WinPooh32
Stack Overflow answer searching expert
Горутины нельзя останавливать извне. Так гласит документация по языку.

В вашем примере остановить выполнение горутин можно только если закрыть канал jobs.
Ответ написан
Комментировать
@apelsinovi-sok
Насколько мне известно, горутины останавливаются либо через проброс контекста, либо через канал
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы