Question

c'est ma première question ici.J'essaie d'exécuter périodiquement des scripts Python parallèles (c'est-à-dire plusieurs instances d'un même script) à partir de Java en utilisant ScheduledThreadPoolExecutor.Ce que j'ai essayé de faire, c'est d'utiliser la classe ProcessBuilder.Pour tester le concept, j'ai mis le premier script en boucle infinie pendant que le second écrit quelque chose dans un fichier et se ferme.Les scripts Python que je dois créer doivent être identiques les uns aux autres, j'ai donc essayé d'exécuter ces deux-là à partir de plusieurs instances d'une même classe qui implémente Runnable.

Cependant, le deuxième script ne démarre jamais.J'ai réussi à résoudre ce problème en créant de nombreuses classes qui ont exactement le même exécutable.Mais il semble très peu pratique d’avoir 10 à 20 classes identiques.Alors, puis-je faire cela d'une manière ou d'une autre dans un seul exécutable ?Voici le code qui montre comment j'ai essayé d'exécuter des scripts à l'aide de 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();
    }

}
}
Était-ce utile?

La solution

Il y a une faute de frappe dans la ligne commençant le 2ème processus :

Process process2 = processBuilder.start();

devrait être bien sûr :

Process process2 = processBuilder2.start();

De plus, vous planifiez 2 tâches, où chaque tâche démarre 2 processus.Ainsi, toutes les 2 secondes, 4 processus sont démarrés (2x test.py, 2x test2.py).Si je comprends bien ce que vous essayez de faire, planifier un seul MyTask1 Cela devrait suffire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top