10 Stimmen

Java-Bibliothek zur Verwaltung eines Prozesspools

Ich arbeite an einem Java-Dämon, der Nebenläufigkeit erfordert: eine Endlosschleife, die auf eine Job-Warteschlange (redis) hört und jeden Job an einen Worker verteilt. Der Worker muss nicht unbedingt einen Wert zurückgeben.

Ich finde Executors ziemlich nützlich und benutze einen ThreadPoolExecutor, um eine bestimmte Anzahl von Worker-Threads zu verwalten.

Allerdings führen diese Worker 3rd-Party-Code aus, der so isoliert wie möglich ausgeführt werden muss, um das Teilen von statischen Eigenschaften zu vermeiden.

Meine Frage: Gibt es eine Java-Bibliothek/Framework, die ähnliche Funktionen wie Executors bietet, wie:

  • Worker-Pools
  • automatisch angepasste Poolgröße

...aber Prozesse anstelle von Threads erstellt?

8voto

Gray Punkte 111812

Ich verstehe, dass Sie Bibliotheken von Drittanbietern haben, die Sie auf irgendeine Weise isoliert ausführen möchten - damit sie beispielsweise keinen Zugriff auf statische Variablen haben.

Ich würde Ihre Aufgaben in einem anderen ClassLoader ausführen. Es gibt Web-Frameworks, die diesen Mechanismus verwenden, um Webanfragen zu isolieren. Das Übergeben von Daten zwischen den Classloadern ist ein wenig heikel. Ich bin mir nicht sicher, wie Jetty es macht. Vielleicht mit einer Art von Socket? Hier ist ein interessanter Artikel über die Verwendung von System.out zum Austausch von Objekten. Sicherlich ein Hack.


Meine Frage ist: Gibt es eine Java-Bibliothek/-Framework, die Funktionen ähnlich wie Executors bietet... aber Prozesse anstelle von Threads startet?

Moderne Betriebssysteme nutzen moderne Mehrprozessorarchitekturen, um das Beste aus Java-Threads herauszuholen. Das Starten eines weiteren Threads innerhalb Ihres aktuellen Prozesses wird auf einem anderen Prozessor ausgeführt, wenn verfügbar, und ist viel effizienter als die Ausführung dieser Aufgabe in einem vollständig separaten Prozess, insbesondere etwas so aufwendiges wie ein weiterer JVM-Prozess.

2voto

SVN Punkte 41

Es gibt ein Projekt in github, um einen Prozesspool zu erstellen. Schau mal rein. https://github.com/shri30/ProcessPool

Hier ist ein Beispiel:

Beispielcode:

public class UsageExample implements JTask{

    public static void main(String args[]) throws Exception{
        //Erstellen Sie einen Pool mit dem Namen: UsageExample-Process und der Anzahl von Prozessen: 3
        ExecutorService pool = ProcessPool.createProcessPool("UsageExample-Process", 3);
        ProcessFuture pf1 = pool.submit(Task.class, args);
        ProcessFuture pf2 =pool.submit(Task.class, args);
        ProcessFuture pf3 =pool.submit(Task.class, args);
        ProcessFuture pf4 =pool.submit(Task.class, args);
        ProcessFuture pf5 =pool.submit(Task.class, args);
        //Die get-Methode blockiert den Aufruf, um das Ergebnis zu erhalten
        TaskStatus ts= pf1.get();
        Status status = ts.getStatus();
        if(status == Status.SUCESS){
        //Hier kommt der Code
        }

        TaskStatus ts2= pf2.get();
        Status status2 = ts.getStatus();
        if(status == Status.SUCESS){
        //Hier kommt der Code
        }

        TaskStatus ts3= pf3.get();
        Status status3 = ts.getStatus();
        if(status == Status.SUCESS){
        //Hier kommt der Code
        }

        TaskStatus ts4= pf4.get();
        Status status4 = ts.getStatus();
        if(status == Status.SUCESS){
        //Hier kommt der Code
        }
        //Beenden Sie den Pool - übergeben Sie true für einen ordnungsgemäßen Abschluss, der zweite Parameter sind Minuten
        //Warten auf Abschluss der Aufgabe
        pool.terminate(true, 3000);
    }

}

class Task implements JTask{

    public static void main(String[] args) {
        System.out.println("Ausführung der Beispielaufgabe");
    }

}

1voto

Bertil Chapuis Punkte 2447

Hast du schon darüber nachgedacht, etwas Ähnliches wie die Verwendung eines ProcessBuilders zur Verwaltung deines isolierten Prozesses zu verwenden?

String myJar = MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
ProcessBuilder pb = new ProcessBuilder("java", "-classpath", myJar, "package.MainClass");
Process p = pb.start();

Ich weiß nicht, ob es eine gute Idee ist, ausführbare Aufgaben, die Unterprozesse verwalten, an ein Executor zu übergeben, aber es könnte eine Lösung sein, um deine Arbeiter zu isolieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X