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

标签 java python parallel-processing processbuilder scheduledexecutorservice

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

但是第二个脚本永远不会启动。我设法通过创建许多具有完全相同的可运行性的类来解决这个问题。但是拥有 10-20 个相同的类似乎非常不切实际。那么我可以在一个可运行的环境中以某种方式做到这一点吗? 这是显示我如何尝试使用 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();
    }

}
}

最佳答案

开始第二个过程的行中有错字:

Process process2 = processBuilder.start();

当然应该是:

Process process2 = processBuilder2.start();

此外,您正在安排 2 个任务,其中每个任务启动 2 个进程。所以每 2 秒有 4 个进程启动(2x test.py,2x test2.py)。如果我正确理解您要执行的操作,那么仅安排一个 MyTask1 就足够了。

关于java - 如何使用 ProcessBuilder 从 java 运行并行 python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22068564/

相关文章:

Java GUI 全屏窗口,内部窗口较小

java - 学习 Spring/Hibernate 的菜鸟项目

java - 使用流将 Map<A, Map<B, C>> 转换为 Map<B, Map<A, C>>

python - Python异常: ConnectionError 10054 An existing connection was forcibly closed by the remote host

language-agnostic - 并发编程和并行编程有什么区别?

bash - 在 bash 中并行化 for 循环

具有持久 TCP 服务器套接字的 Java 应用程序高可用性/故障转移

python - 替代 time.sleep

python无损录音+http流媒体库

parallel-processing - 高性能计算之外的魅力++