Несколько асинхронных сеансов RSelenium

У меня блестящее приложение с несколькими пользователями (в настоящее время 10). Приложение выполняет поиск и очистку веб-сайтов с использованием RSelenium на основе заданных критериев - оно выполняет одну функцию на веб-сайт, и каждый поиск / очистка занимает минуты. Я не хочу, чтобы эти функции блокировали приложение, позволяя пользователям выполнять другую работу и отправлять несколько запросов. Я также хотел бы поддерживать сеансы браузера, избегая входа в систему и т. Д. Каждый раз, когда я запускаю поиск. RSelenium подключается к Selenium Hub + Nodes в контейнере Docker.

В моем текущем подходе есть одна R-функция на скребок в бесконечном цикле, считывающая управляющие сообщения и критерии поиска из очереди в форме таблицы MySQL - что-то вроде сервиса. В то время как пользователи могут продолжать работать и отправлять новые поиски, поиски являются последовательными.

Один последовательный сервис на сайт

Я подумал об использовании futures (будущего пакета), и это должно работать, но это связывает меня с количеством ядер, доступных на аппаратном обеспечении. Поскольку каждый поиск довольно легок в использовании ресурсов, я чувствую, что это пустая трата ресурсов, так как ядро ​​будет заблокировано на несколько минут каждым скребком. Таким образом, я думаю, что это все еще примерно последовательно.

Каждый поиск называется использованием будущего

Я думал о запуске каждого вызова скребка с помощью system таким образом, используя механизм многозадачности ОС. Я полагаю, что это позволило бы мне запускать столько экземпляров скребка, сколько мне нужно, только ограниченный оперативной памятью и т. Д. Однако это затрудняет отслеживание прогресса скребков, а также не позволяет повторно использовать сеансы браузера, поскольку он не возвращает любые предметы. Каждый скрести должен будет войти в систему отдельно.

Каждый поиск вызывается с использованием системы

Наконец, я думаю о размещении скребков на сервере OpenCPU. Поскольку каждый вызов функции в OpenCPU является асинхронным, это должно быть в состоянии масштабировать? И каждая функция может затем вернуть экземпляр remoteDriver, который она использует, чтобы разрешить повторное использование в следующем поиске / очистке (не уверен, что это возможно). Я бы хотел, чтобы основной сценарий работал в бесконечном цикле, который выполнял бы вызовы GET/POST для сценариев поиска / очистки на сервере OpenCPU и получал результаты через обратный вызов HTTP.

Поиск звонков через OpenCPU

Буду признателен за любые идеи о наилучшем способе реализации этого или вклад в сценарии выше.

0 ответов

Другие вопросы по тегам