2016-11-23 91 views
0

我正在构建一个使用库RserveCLI2在Linux计算机上连接到Rserve的ASP.Net应用程序。RServeCLI2是否支持长时间运行的任务?

我已经完成了一项测试,在该测试中,我增加了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 
} 

的job.id从Rserve传递一个递增的一个上的每个迭代中,由20%的有效地增加每一次迭代的持续时间。 5个迭代同时运行,每个迭代从一个单独的线程开始。

我发现完成的最后一项工作持续了大约1小时40分钟。当我停止测试时,以下作业在36小时内未完成。没有新的工作开始。

如果我正确解释它,Eval方法永远不会返回。在e Rserve服务器上,我看到只有2个Rserve进程保持了我在测试的第一个小时内看到的5个进程。

什么可能导致此行为,并且不应该RserceCLI2返回一个错误?

回答

0

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

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

因此,Rserve可能会在某个时间发送响应,但客户永远不会收到这个响应。客户将继续等待回应。我没有调查Rserve如何对此做出反应。

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

我想发送OOB (out-of-band) commands也可以解决这个问题,可以起到心跳作用,但是我没有开发使用的R包,所以实现起来相当复杂。

相关问题