Вопрос или проблема
Некоторые люди могут подумать, что это слишком тривиально, чтобы искать модули или почти отнести это к категории leftPad, возможно, но в npm так много всего, что у меня есть ощущение, что эти два требования удовлетворяются, и мне интересно узнать, что сделали другие люди.
Я унаследовал этот код, который имеет такую длинную функцию обновления с несколькими этапами. У него есть своего рода пользовательский флаг блокировки, который наполовину настроен на истечение срока, но на самом деле не имеет кода для истечения. В любом случае, основная задача — предотвратить выполнение обновления, пока происходит что-то другое. Хотя иногда мы знаем, что нам определенно нужно обновить как можно скорее, но не прямо посреди текущего обновления. Эти вещи на самом деле не совсем работают.
Поэтому я ищу один или два модуля для выполнения двух задач:
-
блокировка с истечением срока действия, которую могут использовать две разные длительно работающие функции (которые вызывают другие функции с обратными вызовами), чтобы убедиться, что они не вмешиваются друг в друга
-
простой модуль/функция, который говорит: ‘выполните эту функцию сейчас или запустите ее снова после завершения текущего выполнения’.
Или, возможно, что-то, что обрабатывает обе эти задачи, действительно имеет смысл в данном случае, хотя из моего описания может быть не очевидно, как они связаны друг с другом.
Истечение срока действия необходимо на случай, если возникнет какая-то ситуация, которую я не предвижу, и блокировка не будет снята, мы не хотим застрять навсегда.
Вот что я решил сделать: я создал действительно простой модуль now-or-again и использую существующий lock-lock с его функцией maxPending вместо времени истечения.
Способ, которым я использую эти два модуля, идентичен примерам в READMEs.
Ответ или решение
На основе вашего описания проблемы, принято решение использовать два модуля npm, которые могут помочь в управлении блокировками и планированием обновлений ваших функций. Обсуждая эти решения, необходимо чётко понимать их назначение и функциональность, чтобы добиться надежной и безопасной работы вашего кода.
Рекомендованные модули
-
lock-lock
- Описание: Этот модуль предоставляет простую и понятную реализацию блокировок, что позволяет избежать одновременного выполнения нескольких долгих функций. "lock-lock" поддерживает функцию
maxPending
, которая отвечает за управление количеством ожидающих операций. Это может быть полезно в вашем случае, когда необходимо гарантировать, что новая операция не начнётся, пока текущая обновление выполняется. - Преимущества:
- Легко интегрируется в существующий код.
- Обеспечивает надежное использование блокировок без необходимости ручного управления временем истечения.
- Управляет количеством операций, которые могут ожидать своей очереди, предотвращая переполнение.
-
Использование: Пример использования из README:
const Lock = require('lock-lock')(options); Lock('myLock', (release) => { // Ваша долгосрочная операция // После завершения вызовите release() release(); });
- Описание: Этот модуль предоставляет простую и понятную реализацию блокировок, что позволяет избежать одновременного выполнения нескольких долгих функций. "lock-lock" поддерживает функцию
-
now-or-again
- Описание: Замечательный модуль, который позволяет вам спектакулярно управлять функциями, которые должны выполняться немедленно или после завершения текущей задачи. Его использование делает управление очередностью вызовов функций более удобным и предсказуемым.
- Преимущества:
- Позволяет избежать конфликтов, когда одна функция должна приостановить выполнение в ожидании завершения другой.
- Простой и понятный интерфейс, основанный на обратных вызовах.
-
Использование: Пример использования из README:
const nowOrAgain = require('now-or-again'); const myFunction = nowOrAgain(() => { // Ваша логика выполнения }); // Вызов myFunction(); будет обрабатывать вызовы как следует.
Итоговое решение
Комбинация вышеупомянутых модулей позволяет вам эффективно управлять блокировками и расписанием обновлений. С использованием lock-lock
для управления блокировками и now-or-again
для обработки вызовов, ваш код сможет избежать конфликтов и обеспечить надежность работы функций. Это решение не только сократит потенциальные проблемы с конкурирующими изменениями данных, но и упростит управление зависимостями между долгосрочными операциями в вашем приложении.
Заключение
В результате, выбор и внедрение указанных модулей в вашу кодовую базу значительно улучшит управление блокировками и обновлениями в вашем проекте. Поскольку вы уже начали использовать now-or-again
и lock-lock
, рекомендую протестировать их на небольших сценариях, чтобы убедиться в стабильности и эффективности решения. Использование проверенных модулей из npm с активным сообществом поможет избежать множества проблем, связанных с concurrency и race conditions.