我正在构建一个使用库Rservecli2。
我进行了一项测试,其中增加了R-Script的运行持续时间,以查看它是否会成功完成。以下是我的代码。
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
}
job.id是从每次迭代中的一个递增的rserve传递,有效地将每次迭代的持续时间提高了20%。5同时运行的迭代,每个迭代从一个单独的线程开始。
我发现完成的最后一份工作持续了大约1小时40分钟。当我停止测试时,以下工作在36个小时内没有完成。没有开始新的工作。
如果我正确解释了它,则评估方法永远不会返回。在E rserve服务器上,我看到我在测试的第一个小时看到的5个rserve过程。
什么可能导致这种行为,不应该带错误返回?
这个问题是由网络防火墙引起的,不是rserve的问题。
客户端和服务器正在通过网络防火墙进行通信。该防火墙配置为阻止闲置2小时的连接。连接实际上并未关闭。据我了解,防火墙无法做到这一点,只有连接的端点才能。
因此,大概,Rserve会在某个时候发送答复,但客户从未收到。客户将继续等待回复。我没有调查rserve对此的反应。
我们将客户端转移到网络的另一部分,在那里它可以与Rserve通信,而无需防火墙。
我想发送OOB(带外)命令也可以解决该问题,可以作为心脏振奋,但我没有开发使用的R包装,因此实现这将是非常复杂的。