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 包,所以实现起来会相当复杂。
我正在构建一个 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 包,所以实现起来会相当复杂。