【问题标题】:Rserve hangs when oppening multiple connections打开多个连接时保留挂起
【发布时间】:2019-01-21 14:26:07
【问题描述】:

我开始 Rserve:

C:\Program Files\R\R-3.5.0\bin\x64> "C:\Users\XXXX\DOCUME~1\R\WIN-LI~1\3.5\Rserve\libs\x64\Rserve.exe" --RS-port 1000

运行以下java代码:

import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;

public class TestR {
    private  RConnection con;
    private  RConnection con2;
    public TestR(){
        try {
            con = new RConnection();
            con2 = new RConnection();
        } catch (RserveException e) {
            e.printStackTrace();
        }
    }
    public Double test(){
        try {

            double d = con.eval("1+1").asDouble();
            double c = con2.eval("1+1").asDouble();
            return d+c;
        } catch (RserveException | REXPMismatchException e) {
            return (double)(-1);
        }
    }
}

我在 JUnit 上创建了以下类来测试它:

import org.junit.Test;

import static org.junit.Assert.*;

public class TestRTest {

    @Test
    public void test(){
        TestR t = new TestR();
        t.test();
    }

}

当我运行此测试时,它会在连接连接时停止,它会创建第一个,但会挂起第二个。知道为什么会发生这种情况吗?

好的

好的

挂起

【问题讨论】:

    标签: java r rserve


    【解决方案1】:

    您的问题可能与多线程问题有关。

    Unix:没问题,一个 Rserve 实例可以服务多个调用。

    Windows:Rserve 无法通过分叉当前进程来创建单独的进程。 --> 为每个线程创建一个新的 Rserve 进程(监听不同的端口),相应端口上也必须建立一个新的 Rserve 连接。

    RConnection connection = new RConnection(HOST, PORT);

    如果您需要更多信息,请随时提出。如果您愿意,我还可以提供我的完整类代码,以使用 Rserve 创建多个 R 实例。

    查看这个Java class 我曾经使用 Rserve 运行多个 R 实例。

    【讨论】:

    • Tnx!这行得通,只需要控制新工作人员使用此连接...