Несколько асинхронных сеансов RSelenium
У меня блестящее приложение с несколькими пользователями (в настоящее время 10). Приложение выполняет поиск и очистку веб-сайтов с использованием RSelenium на основе заданных критериев - оно выполняет одну функцию на веб-сайт, и каждый поиск / очистка занимает минуты. Я не хочу, чтобы эти функции блокировали приложение, позволяя пользователям выполнять другую работу и отправлять несколько запросов. Я также хотел бы поддерживать сеансы браузера, избегая входа в систему и т. Д. Каждый раз, когда я запускаю поиск. RSelenium подключается к Selenium Hub + Nodes в контейнере Docker.
В моем текущем подходе есть одна R-функция на скребок в бесконечном цикле, считывающая управляющие сообщения и критерии поиска из очереди в форме таблицы MySQL - что-то вроде сервиса. В то время как пользователи могут продолжать работать и отправлять новые поиски, поиски являются последовательными.
Я подумал об использовании futures (будущего пакета), и это должно работать, но это связывает меня с количеством ядер, доступных на аппаратном обеспечении. Поскольку каждый поиск довольно легок в использовании ресурсов, я чувствую, что это пустая трата ресурсов, так как ядро будет заблокировано на несколько минут каждым скребком. Таким образом, я думаю, что это все еще примерно последовательно.
Я думал о запуске каждого вызова скребка с помощью system
таким образом, используя механизм многозадачности ОС. Я полагаю, что это позволило бы мне запускать столько экземпляров скребка, сколько мне нужно, только ограниченный оперативной памятью и т. Д. Однако это затрудняет отслеживание прогресса скребков, а также не позволяет повторно использовать сеансы браузера, поскольку он не возвращает любые предметы. Каждый скрести должен будет войти в систему отдельно.
Наконец, я думаю о размещении скребков на сервере OpenCPU. Поскольку каждый вызов функции в OpenCPU является асинхронным, это должно быть в состоянии масштабировать? И каждая функция может затем вернуть экземпляр remoteDriver, который она использует, чтобы разрешить повторное использование в следующем поиске / очистке (не уверен, что это возможно). Я бы хотел, чтобы основной сценарий работал в бесконечном цикле, который выполнял бы вызовы GET/POST для сценариев поиска / очистки на сервере OpenCPU и получал результаты через обратный вызов HTTP.
Буду признателен за любые идеи о наилучшем способе реализации этого или вклад в сценарии выше.