2

这是我的第一个问题。 我想从java定期使用ScheduledThreadPoolExecutor运行并行python脚本(这是一个相同脚本的多个实例)。我试图做的是使用ProcessBuilder类。为了测试这个概念,我把第一个脚本放到了无限循环中,而第二个脚本写入了一些文件并退出。我需要做的Python脚本应该是相同的,所以我试图从实现可运行的同一类的多个instaces中运行这两个脚本。如何使用ProcessBuilder从java运行并行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(); 
    } 

} 
} 

回答

1

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

Process process2 = processBuilder.start(); 

应该是顺理成章的:

Process process2 = processBuilder2.start(); 

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

+0

哦,这正是问题的原因。没有注意到错字!我需要从线程池中安排n个工作线程,其中每个线程在下一个时期之前几次运行相同的脚本。谢谢你,先生 – John