如何使用ProcessBuilder从java运行并行python脚本

时间:2014-02-27 12:29:53

标签: java python parallel-processing processbuilder scheduledexecutorservice

这是我的第一个问题。 我试图使用ScheduledThreadPoolExecutor定期从java运行并行python脚本(即同一脚本的多个实例)。我试图做的是使用ProcessBuilder类。为了测试这个概念,我已将第一个脚本放入无限循环,而第二个脚本将某些内容写入文件并退出。我需要制作的Python脚本应该彼此相同,所以我试图从实现runnable的同一个类的多个实例中运行这两个脚本。

但是第二个脚本永远不会启动。我设法通过创建许多具有完全相同的runnable的类来解决这个问题。但是10-20个相同的课程似乎非常不切实际。那么我可以在一个runnable中以某种方式做到这一点吗? 下面的代码显示了我如何尝试使用ProcessBuilder运行脚本:

public class TestScripts{

public static void main(String[] args){
       ScheduledThreadPoolExecutor threadPool = new ScheduledThreadPoolExecutor(2);
       threadPool.scheduleAtFixedRate(new MyTask1(), 1,2, TimeUnit.SECONDS);
       threadPool.scheduleAtFixedRate(new MyTask1(), 1,2, TimeUnit.SECONDS);
        }
  }


class MyTask1 implements Runnable{
public void run(){
     System.out.println("Task1 is running");
     ProcessBuilder processBuilder = new ProcessBuilder("C:\\Python27\\python.exe",
                                                        "C:\\Python27\\test.py");
     ProcessBuilder processBuilder2 = new ProcessBuilder("C:\\Python27\\python.exe",
                                                           "C:\\Python27\\test2.py");
    processBuilder.redirectOutput(Redirect.INHERIT);

    try {
        Process process = processBuilder.start();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        Process process2 = processBuilder.start();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
}

1 个答案:

答案 0 :(得分:1)

第二个过程开始的行中有一个拼写错误:

Process process2 = processBuilder.start();

当然应该是:

Process process2 = processBuilder2.start();

此外,您正在安排2个任务,每个任务启动2个进程。所以每2秒开始有4个进程(2x test.py,2x test2.py)。如果我理解你正在尝试做什么,只安排一个MyTask1就足够了。