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();
    }

}
}
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top