Вкратце
Возможно ли настроить 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 кредитов, как только этот вопрос будет иметь право.