RServeCLI2 是否支持长 运行 任务?

Does RServeCLI2 support long running tasks?

我正在构建一个 ASP.Net 应用程序,它使用库 RserveCLI2.

在 Linux 机器上连接到 Rserve

我做了一个测试,我增加了 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 方法永远不会 returned。在 e Rserve 服务器上,我看到在测试的最初几个小时内看到的 5 个 Rserve 进程只剩下 2 个。

什么会导致此行为并且不应该 RserceCLI2 return 出错?

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

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

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

我们将客户端移动到网络的另一部分,它可以在没有防火墙的情况下与 Rserve 通信。

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