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