Когда дело доходит до современных приложений, часто возникает необходимость многократно выполнять какой-то фрагмент кода в течение заданных интервалов времени. Это может быть что угодно: от анализа данных из внешних источников или отправки некоторого объема данных до запуска любого обработчика / опросчика очереди и т. Д.
Думаю, в ваших проектах у вас была такая же проблема, не так ли?
С моей командой мы столкнулись с этой проблемой во время разработки нашего предыдущего проекта. Поскольку приложение начало расти, некоторые его части требовали непрерывного выполнения с определенными предопределенными интервалами, и мы решили разработать библиотеку, которая поможет нам элегантно планировать такие типы задач.
Вы можете найти это здесь".
Давайте погрузимся в это!
Эта библиотека довольно проста, всего 50 строк кода. Основная идея, лежащая в основе этого, состоит в том, чтобы собрать функции отмены контекста для каждого добавленного задания (чтобы отменить их в случае необходимости) и запустить горутину, которая будет выполнять это задание каждый раз. Тикер с галочкой предоставленный временной интервал.
Вот структура Планировщика, в которой есть методы Добавить () и Стоп (). Он состоит из sync.WaitGroup и фрагмента context.CancelFunc. WaitGroup используется для корректной остановки всех запущенных заданий при завершении работы приложения.
Вот как ведут себя методы Add () и Stop (). Как видите, метод Stop () ожидает завершения всех запущенных горутин с помощью вызова wg.Wait ().
Job - это определенный тип, который представляет собой простую функцию (ctx context.Context).
Когда задание добавляется с определенным интервалом, мы запускаем горутину, которая прослушивает каналы ticker.C и ctx.Done ().
Итак, это все. Действительно просто :)
Посмотреть в действии
Представьте, что у нас есть монолитное приложение, состоящее из множества различных частей. Существует модуль, который должен постоянно собирать некоторые часто обновляемые данные о подписке от поставщика платежей каждые N минут, а другой модуль должен отправлять вычисленную статистику на аналитический сервер каждые M минут. Это будет выглядеть так:
И не забудьте вызвать метод Stop () при завершении работы приложения, чтобы завершить его корректно.
Не стесняйтесь использовать планировщик в своих проектах Go и улучшать его с помощью запросов на вытягивание!