【问题标题】:Setting up an R-Server that supports asynchronous communication with clients设置支持与客户端异步通信的 R-Server
【发布时间】:2012-12-11 16:04:00
【问题描述】:

总之

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

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

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

更多详情

首先:关于那些细节的信息学细节,我的背景都是“DIY”,所以像 socket 通信,关于 master-server 概念的细节异步通信等对我来说很新鲜。所以请不要咬人;-)

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

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

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

家庭作业

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

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

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

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

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

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

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

任何指针都会非常感激!


编辑

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

【问题讨论】:

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

标签: r sockets webserver client-server


【解决方案1】:

Rserve 正是为此而设计的。

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

另请参阅Rserve.cluster 包,以将并行处理调度到Rserve 实例。

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

【讨论】:

  • 太棒了!非常感谢您的快速回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 2013-10-17
  • 2019-11-12
  • 1970-01-01
相关资源
最近更新 更多