RServeCLI2是否支持长时间运行的任务?

时间:2016-11-23 19:24:20

标签: rserve

我正在使用库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不应该返回错误?

1 个答案:

答案 0 :(得分:0)

此问题是由网络防火墙引起的,并不是Rserve的问题。

客户端和服务器通过网络防火墙进行通信。此防火墙配置为阻止已空闲2小时的连接。连接实际上并未关闭。据我了解,防火墙不能这样做,只有连接的端点可以。

因此,Rserve可能会在某个时间发送响应,但客户从未收到过此消息。客户端将继续等待响应。我没有调查Rserve对此的反应。

我们将客户端移动到网络的另一部分,在那里它可以与Rserve通信而不需要防火墙。

我认为发送OOB (out-of-band) commands也可以解决这个问题,起到了心跳的作用,但我没有开发出使用的R-package,因此实现起来相当复杂。