Когда дело доходит до современных приложений, часто возникает необходимость многократно выполнять какой-то фрагмент кода в течение заданных интервалов времени. Это может быть что угодно: от анализа данных из внешних источников или отправки некоторого объема данных до запуска любого обработчика / опросчика очереди и т. Д.

Думаю, в ваших проектах у вас была такая же проблема, не так ли?

С моей командой мы столкнулись с этой проблемой во время разработки нашего предыдущего проекта. Поскольку приложение начало расти, некоторые его части требовали непрерывного выполнения с определенными предопределенными интервалами, и мы решили разработать библиотеку, которая поможет нам элегантно планировать такие типы задач.

Вы можете найти это здесь".

Давайте погрузимся в это!

Эта библиотека довольно проста, всего 50 строк кода. Основная идея, лежащая в основе этого, состоит в том, чтобы собрать функции отмены контекста для каждого добавленного задания (чтобы отменить их в случае необходимости) и запустить горутину, которая будет выполнять это задание каждый раз. Тикер с галочкой предоставленный временной интервал.

Вот структура Планировщика, в которой есть методы Добавить () и Стоп (). Он состоит из sync.WaitGroup и фрагмента context.CancelFunc. WaitGroup используется для корректной остановки всех запущенных заданий при завершении работы приложения.

Вот как ведут себя методы Add () и Stop (). Как видите, метод Stop () ожидает завершения всех запущенных горутин с помощью вызова wg.Wait ().

Job - это определенный тип, который представляет собой простую функцию (ctx context.Context).

Когда задание добавляется с определенным интервалом, мы запускаем горутину, которая прослушивает каналы ticker.C и ctx.Done ().

Итак, это все. Действительно просто :)

Посмотреть в действии

Представьте, что у нас есть монолитное приложение, состоящее из множества различных частей. Существует модуль, который должен постоянно собирать некоторые часто обновляемые данные о подписке от поставщика платежей каждые N минут, а другой модуль должен отправлять вычисленную статистику на аналитический сервер каждые M минут. Это будет выглядеть так:

И не забудьте вызвать метод Stop () при завершении работы приложения, чтобы завершить его корректно.

Не стесняйтесь использовать планировщик в своих проектах Go и улучшать его с помощью запросов на вытягивание!