170 похожих чатов

Привет всем Помогите пожалуйста разобраться c EventLoop У меня есть handler(ctx) {

while ( loop = true ) {
if ( queue.length > 1 )
await doSomeAsyncStuff()
if ( queue.length < 10 )
await populateQueue() //пополняем очередь из бд
}
}

Проблема в том что эта лупа блокирует выполнение модуля полностью

Мне нужно сделать так, чтобы постоянно выполнялась эта функция, и выполнение модуля не прерывалось. Я попробовал сделать setTimeOut, но тогда возникает проблема, что doSomeAsynStuff() и populateQueue() накладываются друг на друга и все начинает идти наперекосяк.

Получается, что мне нужно закидывать в EventQueue задачи, но как гарантировать, что они будут выполнятся поочередно, не накладываясь друг на друга? Ведь операция может занять как 5мс, так и целую секунду.

17 ответов

19 просмотров

так если у вас await там то цикл будет ждать пока не выполнится функция. вы как вызываете этот handler?

Egor- Автор вопроса

В молекуляре экшн

Egor- Автор вопроса

Только этот хендлер полностью блокирует выполнение модуля. А когда я закидывал все через setTimeOut, то получалось по несколько одновременных запросов

Он не должен полностью блокировать. Может проблемы в другом коде? А вообще может тебе cron нужен?

Egor- Автор вопроса

Пробовал крон, но у молекуляра крон модуль странновато работает, как мне показалось. Да и так все равно нне совсем то что нужно

Использовал крон молекуляровский, всё ок было

Egor- Автор вопроса

Из официальной доки который? Их несколько

github.com/davidroman0O/moleculer-cron

Egor- Автор вопроса

Да, он самый Ну с кроном простой в бездействии у меня будет достаточно долгий

Ну значит надо больше кода чтобы понять где проблема Тот цикл не должен блочить процесс

ну, вообще-то заблочит легко, если оба условия не выполнятся когда queue.length === undefined, например

Действительно

У тебя там размер массива то какой? Может массив всегда пуст, например?

Egor- Автор вопроса

Я просто от компа ушел уже, скину завтра код. Массив всегда не больше 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);

Ассинк иттератор вам поможет

Можно пример кода?

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

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта