@onlinejunior

Как послать в пул — воркер команду ожидания?

Когда я обращаюсь к api сайта, то моя сессия может истечь, что приводит к повторной авторизации. Во время авторизации мой pool.Work продолжают работать, а тем временем обработчик запросов получает информацию от сервера, мол сессия то истекла и доступ к сайту запрещен. Таким образом получается я не до получаю ответы от сервера с нужной мне информацией.

Беря ключевые слова из файла я посылаю их в pool.Work после чего он распределяет их по рабочим и вызывается сам обработчик func DoWork который и может вернуть ответ от сервера.

Вопрос:

Как мне сделать паузу когда DoWork получил уведомление об истекшей сессии, до получения новой сессии.
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 3
@falconandy
Как грубый вариант:

1. пул воркеров, которые тянут информацию, передавая данные о сессии, но сами (пере)авторизацией не занимаются
2. отдельная горутина, которая занимается (пере)авторизацией
3. текущая сессия (токен, куки)
4. Condition Variable (https://golang.org/pkg/sync/#Cond), с помощью которой синхронизируется доступ у текущей сессии

Изначально:
текущей сессии нет, воркеры ждут сигнала от Condition Variable
Горутина авторизации видит что текущей сессии нет, авторизуется, устанавливает текщую сессию и broadcast-ит событие с помощью Condition Variable. После чего засыпает до сигнала от Condition Variable.
Воркеры просыпаются и начинают работу.

Сессия протухла:
Воркер получает статус необходимости авторизации (например статус 401), сбрасывает текущую сессию (если она установлена и равна той про которую он знал), и broadcast-ит событие с помощью Condition Variable.
Горутина авторизации просыпается, видит что текущей сессии нет, снова начинает процесс авторизации.
В это время другие воркеры получают 401, они проверяют, что текущая сессия пуста и засыпают до сигнала от Condition Variable
Горутина авторизации, закончив процесс авторизации, устанавливает текщую сессию и broadcast-ит событие с помощью Condition Variable. После чего вновь засыпает до сигнала от Condition Variable.
Приостановленные воркеры просыпаются и переповторяют запросы.
Воркеры, которые не успели заснуть, просто переповторяют запрос с новым значением сессии.
Ответ написан
Комментировать
WinPooh32
@WinPooh32
Stack Overflow answer searching expert
Как мы должны догадаться что такое сессия в вашем понимании? Вы даже не написали, как у вас организован пул воркеров и как ваши воркеры обрабатывают задания.

Делайте stateless архитектуру и присылайте сессию вместе с заданием.

Для хранения состояния сессии в Го есть context.Context, который можно отменять (учтите, что придется обарабатывать отмену вручную).
Ответ написан
Комментировать
Как уже написал WinPooh32 - используйте пакет Context.
В частности контекст отмены, который вы будете обрабатывать в воркерах.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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