Как написать скрипт, который будет получать какие-то данные и обрабатывать их параллельно?
Как написать скрипт, который будет получать какие-то данные и обрабатывать их параллельно?
Более подробно:
Есть какой-то 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 отдает мои задачи, я их обрабатываю
nodejs полностью асинхронный, когда ты вызываешь метод, помеченный async (при вызове не надо писать await) то в любой момент когда в этом методе вызывается асинхронный метод или стоит await, node будет вываливаться в свой главный event loop и обрабатывать другие запросы
ты спокойно пиши свой setTimer, внутри вызывай свой метод без await (он должен быть помечен как async) и все должно красиво работать, везде где это возможно либо заворачивай в async метод, либо работай с promise либо пользуйся готовыми асинхронными методами
И как поможет? Он постучиться в апи, тут действительно асинхронно все будет, а дальше что-то обрабатывать нужно, и если не юзать воркеры, это заблокирует основной поток. Тут воркеры нужны
Александр Панков, ну может я что-то не понял в постановке вашей задачи, но если делаете cpu intensive задачу в ноде без воркеров, то это блокирует поток основной в котором EL крутится.
Не знаю как в ноде это работает, но в питоне просто потоками рулишь. Создаешь кол-во потоков равное количеству в "очереди", и каждый объект из очереди запихиваешь в поток. По выполнению всех потоков переходишь к первому шагу - запрашиваешь "очередь", делаешь кол-во потоков....
Михаил Р., и? Может я его на какие-то мысли натолкну. Некоторые языки программирования работают в некоторых областях схоже, возможно он и для ноды такой вариант найдет.