Rservecli2是否支持长期运行的任务



我正在构建一个使用库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包装,因此实现这将是非常复杂的。

相关内容

  • 没有找到相关文章

最新更新