我正在使用库RserveCLI2构建一个连接到Linux机器上的Rserve的ASP.Net应用程序。
我做了一个测试,在其中我增加了R脚本的运行持续时间,看它是否能成功完成。以下是我的代码。
try
{
using (var rConnection = RserveCLI2.RConnection.Connect(_host, _port, _credentials))
{
rConnection.Assign("job.id", new SexpArrayInt(jobId));
rConnection.Eval($"try(source(\"script.R\"), silent=T)");
string errMessage = rConnection.Eval("geterrmessage()").ToString();
if (errMessage == "")
{ success = true; }
else
{ success = false; }
}
}
catch (Exception e)
{ success = false; }
return success;
和R脚本:
test.start <- Sys.time()
test.duration <- (1.2 ^ (job.id)) * 10 # in seconds.
test.i <- 0
while(as.numeric(difftime(Sys.time(), test.start), units="secs") < test.duration) {
test.i <- test.i + 1
}
每次迭代都会从Rserve传递job.id并增加1,从而有效地将每次迭代的持续时间增加20%。同时运行的5次迭代,每次迭代都从一个单独的线程开始。
我发现完成的最后一份工作持续了大约1小时40分钟。当我停止测试时,以下工作在36小时内没有完成。没有新的工作岗位开始。
如果我正确解释它,Eval方法永远不会返回。在e Rserve服务器上,我看到在测试的第一个小时内我只看到了5个Rserve进程。
什么可能导致此行为,并且RserceCLI2不应该返回错误?
答案 0 :(得分:0)
此问题是由网络防火墙引起的,并不是Rserve的问题。
客户端和服务器通过网络防火墙进行通信。此防火墙配置为阻止已空闲2小时的连接。连接实际上并未关闭。据我了解,防火墙不能这样做,只有连接的端点可以。
因此,Rserve可能会在某个时间发送响应,但客户从未收到过此消息。客户端将继续等待响应。我没有调查Rserve对此的反应。
我们将客户端移动到网络的另一部分,在那里它可以与Rserve通信而不需要防火墙。
我认为发送OOB (out-of-band) commands也可以解决这个问题,起到了心跳的作用,但我没有开发出使用的R-package,因此实现起来相当复杂。