Como executar paralelo python scripts de java utilizando os ProcessBuilder
-
23-12-2019 - |
Pergunta
esta é a minha primeira pergunta aqui.Eu estou tentando executar em paralelo os programas em python (que é várias instâncias de um mesmo script) de java periodicamente usando o ScheduledThreadPoolExecutor.O que eu tentei fazer foi utilizar a ProcessBuilder classe.Para testar o conceito de eu ter colocado o primeiro script em loop infinito, enquanto o segundo escreve algo para o arquivo e sai.Scripts em Python eu preciso fazer deve ser idêntico ao do outro, assim eu tentei executar estas duas partir de vários instaces de uma mesma classe que implementa runnable.
No entanto, o segundo script nunca começa.Eu consegui resolver isso criando muitas classes que têm exatamente o mesmo runnable.Mas parece altamente impraticável ter de 10 a 20 aulas, que são a mesma.Então eu posso fazer isso, de alguma forma, dentro de um runnable?Aqui está o código que mostra o quanto tentei executar scripts usando o 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();
}
}
}
Solução
Há um erro de digitação na linha de partida 2º processo:
Process process2 = processBuilder.start();
deve ser claro:
Process process2 = processBuilder2.start();
Além do agendamento de 2 tarefas, onde cada tarefa começa 2 processos.Para cada 2 segundos existem 4 processos iniciados (2x test.py 2x test2.py).Se eu entendi corretamente o que você está tentando fazer, agendamento de apenas um MyTask1
deve ser o suficiente.