12

简而言之

是否可以设置一个可以以异步方式处理/调度多个客户端请求的 R-Server?

我想我正在寻找某种套接字通信。或者有什么更有效的方法可以让 R 与其他应用程序对话?

现在,我真的不在乎通信是否最终通过“普通套接字通信”(类似于socketConnection(port=6011, server=TRUE)服务器进程、socketConnection(host=Sys.info()["nodename"], port=6011)客户端进程与 JSON 字符串的组合writeLines()readLines()或其他方式实现“高级”,例如使用基于 HTTP 请求的 Web 服务器设施。

更多细节

首先:关于那些细节的信息学细节,我的背景都是“DIY”,所以像套接字通信、主服务器概念异步通信等细节对我来说是相当新的。所以请不要咬人;-)

我希望我的一个进程充当 R-Server。AFAIU, R 不是在“多线程范式”下设计的。所以我想知道如何让我的 R-Server 以异步方式处理并发客户端请求(当前来自通过 JSON 样式字符串发送其请求/对象的第三方软件) 。

用简单的英语,我想告诉我的服务器进程是这样​​的:

一旦您在端口 xy 收到传入消息,请执行您需要做的事情,但立即切换回“响应模式”以便能够处理下一个客户端请求,并始终注意每个客户端获得与其逻辑链接的结果各自的要求。

家庭作业

我从一些非常基本的东西开始:

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

这将使我的 R 进程成为服务器。它是一种享受,但由于con是我的“唯一”连接对象,服务器注定要按顺序处理每个客户端请求:

从连接读取输入,进行一些计算,将输出写回连接,然后才处理下一个客户端请求。

我想过让我的服务器进程立即将需要完成的所有事情分派给辅助 Rscript 进程,以便“主”服务器进程准备好接受下一个请求。但是由于最终结果需要con再次通过(在我的“主”服务器进程中),我认为这并没有真正让我得到任何分数,因为服务器进程仍然需要等到辅助进程完成在接受下一个请求之前。或者我可以告诉这个辅助过程以某种方式“直接”报告回客户端请求吗?

尽管我目前的目标不是将我的服务器变成一个成熟的 Web 服务器,但乍一看,这些复杂的 Web 服务器方法对我来说似乎很有希望:

是否可以使用其中之一进行异步客户端通信?

任何指针都将不胜感激!


编辑

一旦问题符合条件,我将提供 300 学分的赏金。

4

1 回答 1

14

Rserve正是为此而设计的。

它支持许多客户端,R 就是其中之一。在RSclient包中,您可以RS.eval(.., wait=FALSE)在后台执行评估。RS.collect您可以使用可以指定连接列表的位置收集结果。

另请参阅Rserve.cluster包以将并行处理分派到Rserve实例。

如果您还希望以其他方式进行异步通信(从服务器到客户端),请参阅 Rserve 中的 OOB 命令(这些是代表服务器而不是客户端执行的未经请求的命令)。如果需要,现在还提供代理支持。请在stats-rosuda-devel邮件列表中提问。

于 2012-12-11T20:35:50.117 回答