Настройка R-сервера, поддерживающего асинхронную связь с клиентами

Вкратце

Возможно ли настроить R-сервер, который может обрабатывать или отправлять несколько клиентских запросов асинхронным способом?

Наверное, я ищу какую-то сокет-связь. Или есть что-то еще более эффективное, чтобы R разговаривать с другими приложениями?

Теперь меня не волнует, что связь в конечном итоге реализуется через "обычную связь с ванильным socketConnection(port=6011, server=TRUE) " (что-то вроде socketConnection(port=6011, server=TRUE) для серверного процесса, socketConnection(host=Sys.info()["nodename"], port=6011) для клиентских процессов в сочетании с writeLines() и readLines() символьных строк JSON) или что-то более "продвинутое", например, с использованием средств веб-сервера на основе HTTP-запросов.

Подробнее

Первое из: "Мой опыт в отношении этих подробных сведений о информатике - это все" DIY ", поэтому такие вещи, как сокетная связь, подробности о концепциях мастер-сервера или асинхронная связь и т.д., Мне очень новы. Так что, пожалуйста, не кусайте ;-)

Я хотел бы, чтобы один из моих процессов выступал в роли R-сервера. AFAIU, R не был разработан в рамках "многопотоковой парадигмы". Поэтому я задаюсь вопросом, как я могу заставить R-Server обрабатывать одновременные клиентские запросы (в настоящее время поступающие от стороннего программного обеспечения, которое отправляет свои запросы/объекты через строки символов в стиле JSON) асинхронным способом.

На простом английском языке я хотел бы сказать, что мой сервер обрабатывает что-то вроде этого:

Как только вы получите входящее сообщение в порту xy, сделайте то, что вам нужно сделать, но сразу же вернитесь в "режим реагирования", чтобы иметь возможность обрабатывать следующий запрос клиента и всегда заботиться о том, чтобы каждый клиент получал результаты, логически связанные с его соответствующий запрос.

Домашнее задание

Я начал с чего-то очень простого:

con <- socketConnection(port=as.numeric(port), server=TRUE)

Это заставило бы мой R-процесс стать сервером. Это работает, но поскольку con - мой "единственный" объект соединения, сервер обречен обрабатывать каждый запрос клиента последовательно:

Прочитайте ввод из соединения, выполните некоторые вычисления, напишите вывод обратно в соединение и только затем обработайте следующий запрос клиента.

Я думал о том, что мой серверный процесс сразу отправит все, что нужно сделать, в вспомогательный процесс Rscript, чтобы "основной" серверный процесс был готов принять следующий запрос. Но так как в конце дня результаты должны снова проходить через con (в моем "основном" серверном процессе), я думаю, что на самом деле мне не нужны какие-либо точки, поскольку серверный процесс все еще должен ждать, пока вспомогательный процесс не будет закончил, прежде чем принимать следующий запрос. Или я могу сказать, что этот вспомогательный процесс "как-то" сразу возвращает запрос клиента?

Несмотря на то, что в настоящее время я не пытаюсь превратить свой сервер в полноценный веб-сервер, эти сложные подходы к веб-серверу выглядели очень многообещающими для меня на первый взгляд:

Возможна ли асинхронная клиентская связь с одним из них?

Любой указатель будет очень благодарен!


РЕДАКТИРОВАТЬ

Я предлагаю щедрость в размере 300 кредитов, как только этот вопрос будет иметь право.

Ответ 1

Rserve был разработан, чтобы делать именно это.

Он поддерживает множество клиентов, R - один из них. В пакете RSclient вы можете выполнить RS.eval(.., wait=FALSE) чтобы выполнить оценку в фоновом режиме. Вы собираете результат с помощью RS.collect где вы можете указать список подключений.

См. Также пакет Rserve.cluster для отправки параллельной обработки экземплярам Rserve.

Если вы также хотите асинхронную связь другим способом (от сервера к клиенту), см. Команды OOB в Rserve (это незапрошенные команды, выполняемые от имени сервера, а не клиента). В случае необходимости также поддерживается поддержка прокси. Пожалуйста, задавайте вопросы в списке рассылки stats-rosuda-devel.