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


简而言之

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

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

现在,我真的不在乎通信是否最终通过“普通的套接字通信”实现(类似于 socketConnection(port=6011, server=TRUE) 对于服务器进程, socketConnection(host=Sys.info()["nodename"], port=6011) 与客户进程结合使用 writeLines() 和 readLines() JSON字符串)或更高级的东西,比如使用基于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个积分的赏金。


2003
2017-12-11 16:04


起源

我认为这个问题值得赏心悦目 - agstudy
@agstudy:你是对的。考虑一下(一旦这个问题有资格获得赏金,我就会在柜台上放300个积分);-) - Rappster
请尝试明确异步需求?例如,在你的问题中添加一个用例(典型需求)?客户要求完成一项任务而不是......当任务完成时...他收到一个警报...... - agstudy
好吧,一旦我把赏金拿出来,我会尝试提出一个很好的用例。 - Rappster


答案:


Rserve 旨在做到这一点。

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

也可以看看 Rserve.cluster 用于调度并行处理的包 Rserve 实例。

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


14
2017-12-11 20:35



太棒了!非常感谢您的快速回答! - Rappster