设置支持与客户端进行异步通信的R-Server

时间:2012-12-11 16:04:01

标签: r sockets webserver client-server

简而言之

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

我想我正在寻找某种套接字通信。或者让R与其他应用程序交谈更有效率吗?

现在,我真的不在乎通信是否通过"普通的套接字通信" (类似于socketConnection(port=6011, server=TRUE)用于服务器进程,socketConnection(host=Sys.info()["nodename"], port=6011)用于客户端进程以及writeLines()readLines()的JSON字符串)或更多内容&#34 ;高级"比如使用基于HTTP请求的Web服务器设施。

更多详情

第一部分:关于那些细节信息学细节的背景是" DIY",所以像套接字通信,关于主服务器概念的细节异步通信等对我来说都是新手。所以请不要咬人; - )

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

简单地说,我想告诉我的服务器进程是这样​​的:

  
    

在端口xy收到传入消息后,执行您需要执行的操作,但立即切换回"响应模式"能够处理下一个客户端请求,并始终注意每个客户端获取逻辑上链接到其相应请求的结果。

  

作业

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

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

这会使我的R进程成为服务器。这是一种享受,但由于con是我的&#34;只有&#34;连接对象,服务器注定要按顺序处理每个客户端请求:

  
    

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

  

我想过让我的服务器进程立即将需要完成的所有事情发送到辅助Rscript进程,以便&#34; main&#34;服务器进程已准备好接受下一个请求。但是,由于在一天结束时结果需要再次通过con(在我的&#34;主要&#34;服务器进程中),我认为这并没有真正让我得到任何积分在进行下一个请求之前,服务器进程仍需要等到辅助进程完成。或者我可以直接告诉这个辅助过程&#34;以某种方式回复客户请求?

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

是否可以与其中一个进行异步客户端通信?

任何指针都将非常赞赏!


修改

一旦问题符合条件,我就会提供300个积分的赏金。

1 个答案:

答案 0 :(得分:14)

Rserve的目的是为了做到这一点。

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

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

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