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 отдает мои задачи, я их обрабатываю
  • Вопрос задан
  • 262 просмотра
Решения вопроса 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.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы