PankovAlxndr
@PankovAlxndr
Fullstack web developer

Как написать скрипт, который будет получать какие-то данные и обрабатывать их параллельно?

Как написать скрипт, который будет получать какие-то данные и обрабатывать их параллельно?

Более подробно:

Есть какой-то api и у него есть запрос, который возвращает объект.
node.js должна постучаться в этот api и получить от него объект.

Получив объект, она от 10 до 120 cекунд что-то с ним выполняет (в моем случае работает puppeteer + запросы на это же api, всякие простые сохранения данных, "прогулка по вкладкам" и тп).

Это все в цикле бесконечно нужно выполнять как я понимаю, те постоянно(периодично) нужно слушать (стучатся) в api из node.js, как там появился ответ, брать его в работу, но ответов этих может быть "очередь", 1-2-3-4-5 штук.. и я бы хотел не поочередно обрабатывать их, а параллельно (я точно знаю что ограничен 10 штуками, те 10 объектов в один момоент времени максимально могу обработать, больше мне api не отдаст).

сейчас я написал код в setInterval внутри которого setInterval, он работает, но мои задачи (объекты) из api обрабатываются последовательно (логично, у меня куча await в puppeteer и axios).

я пришел в node из php, там с асинхронностью не работал.
Подскажите примерами, ссылками на статьи, как оно работает и как решить такую задачу?

те мне нужно
- постучаться в апи и получить первую задачу
- поставить ее в обработку (код сделает все что нужно и завершит итерацию)
- сразу же (пока идет обработка первой задачи) постучаться еще раз в api и получить следующую задачу
- поставить ее в обработку
- уже имею 2 "потока" обработки
- постучаться еще раз в api и получить следующую задачу
...
...
- и так далее пока мне api отдает мои задачи, я их обрабатываю
  • Вопрос задан
  • 282 просмотра
Решения вопроса 1
@rPman
nodejs полностью асинхронный, когда ты вызываешь метод, помеченный async (при вызове не надо писать await) то в любой момент когда в этом методе вызывается асинхронный метод или стоит await, node будет вываливаться в свой главный event loop и обрабатывать другие запросы

ты спокойно пиши свой setTimer, внутри вызывай свой метод без await (он должен быть помечен как async) и все должно красиво работать, везде где это возможно либо заворачивай в async метод, либо работай с promise либо пользуйся готовыми асинхронными методами
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@ragnvaldr9
Вот серия статей про многопоточность в Node.js.
https://habr.com/ru/company/tensor/blog/689144/
Нужно экспериментировать с worker-threads.

А так лучше это на Go написать, там попроще будет с горутинами.
Ответ написан
Комментировать
@maksam07
Не знаю как в ноде это работает, но в питоне просто потоками рулишь. Создаешь кол-во потоков равное количеству в "очереди", и каждый объект из очереди запихиваешь в поток. По выполнению всех потоков переходишь к первому шагу - запрашиваешь "очередь", делаешь кол-во потоков....
Ответ написан
DollyPapper
@DollyPapper
Пулишь свою задачу из апи асинхронно, всё по классике. Дальше используешь Worker Threads.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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