【问题标题】:Does RServeCLI2 support long running tasks?RServeCLI2 是否支持长时间运行的任务?
【发布时间】:2016-11-23 19:24:20
【问题描述】:

我正在使用库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 
}

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

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

如果我解释正确,Eval 方法就永远不会返回。在 e Rserve 服务器上,我看到在测试的前几个小时看到的 5 个 Rserve 进程中只剩下 2 个。

什么可能导致这种行为,RserceCLI2 不应该返回错误吗?

【问题讨论】:

    标签: rserve


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      相关资源
      最近更新 更多