while ( loop = true ) {
if ( queue.length > 1 )
await doSomeAsyncStuff()
if ( queue.length < 10 )
await populateQueue() //пополняем очередь из бд
}
}
Проблема в том что эта лупа блокирует выполнение модуля полностью
Мне нужно сделать так, чтобы постоянно выполнялась эта функция, и выполнение модуля не прерывалось. Я попробовал сделать setTimeOut, но тогда возникает проблема, что doSomeAsynStuff() и populateQueue() накладываются друг на друга и все начинает идти наперекосяк.
Получается, что мне нужно закидывать в EventQueue задачи, но как гарантировать, что они будут выполнятся поочередно, не накладываясь друг на друга? Ведь операция может занять как 5мс, так и целую секунду.
так если у вас await там то цикл будет ждать пока не выполнится функция. вы как вызываете этот handler?
В молекуляре экшн
Только этот хендлер полностью блокирует выполнение модуля. А когда я закидывал все через setTimeOut, то получалось по несколько одновременных запросов
Он не должен полностью блокировать. Может проблемы в другом коде? А вообще может тебе cron нужен?
Пробовал крон, но у молекуляра крон модуль странновато работает, как мне показалось. Да и так все равно нне совсем то что нужно
Использовал крон молекуляровский, всё ок было
Из официальной доки который? Их несколько
github.com/davidroman0O/moleculer-cron
Да, он самый Ну с кроном простой в бездействии у меня будет достаточно долгий
Ну значит надо больше кода чтобы понять где проблема Тот цикл не должен блочить процесс
ну, вообще-то заблочит легко, если оба условия не выполнятся когда queue.length === undefined, например
Действительно
У тебя там размер массива то какой? Может массив всегда пуст, например?
Я просто от компа ушел уже, скину завтра код. Массив всегда не больше 100 строк. и соответственно если на нуле то пополняется этой же функцией. Скрейпер который из базы берет номера и пробивает постоянно
Конструкция while (true) это идиома из синхронных языков программирования чтобы заставить что-то работать вечно. К примеру, вы пишите демон на php, и там нужно такое чтобы он всегда искал и делал, пока его не убьют через kill. смотрите, судя по условиям, за один проход у вас может выполняться и тот, и другой метод. Из кода не ясна суть бизнес-задачи, поэтому точное решение предложить сложно. Но одно ясно - у вас классическая pub/sub задача. У вас есть хранилище заданий, которое должно пополняться и задачи из него должны выполняться. Это самая обычная FIFO-очередь. Реализовать можно как угодно: redis, rabbit, bull и т.п. Хоть даже пишете собственный объект, наследуете его от eventEmitter и реализуете его так, чтобы он сам мог генерить события. 1) создаете слушателя, который подписывается на очередь и выполняет задачи если она не пуста. Такой подход позволит запускать выполнение тасков параллельно, а не последовательно queueObject.on('newtask', doSomeAsyncStuff(task)); 2) в зависимости от вашей задачи реализуете пополнение очереди, можно хоть через setInterval setInterval(() => { if (queueObject.length < 10) populateQueue(); }, 1000);
Ассинк иттератор вам поможет
Можно пример кода?
Обсуждают сегодня