Je suis en train de construire un framework en Java qui va écouter les évènements et les traiter ensuite en Jython. Différents types d'événements seront envoyés à différents scripts.Comment faire pour exécuter des scripts jython multithread exécutés à partir de Java?
Étant donné que jython prend un certain temps à compiler le script lorsque PythonInterpreter.exec() est appelé, je vais devoir pré-compiler les scripts. Je fais de la façon suivante:
// initialize the script as string (would load it from file in final version)
String script = "print 'foo'";
// get the compiled code object
PyCode compiled = org.python.core.__builtin__.compile(script, "<>", "exec");
L'objet compilé PyCode serait poussé au référentiel et utilisé comme des événements viennent dans
PythonInterpreter pi = new PythonInterpreter();
pi.set("variable_1", "value_1");
pi.set("variable_x", "value_x");
pi.exec(compiled);
Maintenant pour mon énigme - il peut arriver qu'il y ait plusieurs des événements de certains types se produisent en même temps - donc plusieurs instances de script s'exécutant en même temps.
Presque tous les scripts resteraient probablement de courte durée - jusqu'à 100 lignes, sans boucles. Le nombre et la fréquence sont complètement aléatoires (événements générés par l'utilisateur) et peuvent aller de 0 à environ 200 par seconde par type d'événement.
Quelle serait la meilleure façon de le faire? Je regarde quelques possibilités:
- synchronisation d'utilisation au point d'événement déclencheur - cela empêcherait plusieurs instances de même script, mais aussi des événements ne serait pas traitée aussi rapidement qu'ils devraient être
- créer une piscine des scripts de même type en quelque sorte peuplés par le clonage de l'objet PyCode original - le plus gros problème serait probablement l'optimisation des tailles de pool
- clonez dynamiquement l'objet de script du parent chaque fois que nécessaire, puis supprimez-le quand exec() se termine - de cette façon le décalage est supprimé à partir de la compilation mais il est toujours présent dans la méthode de clonage
Probablement la combinaison des numéros 2 et 3 serait la meilleure - création de tailles de pools dynamiques?
Alors, des pensées? ;)
Nice! Fonctionne comme un charme;) Il est à noter qu'une instance de PythonInterpreter DOIT être créée avant le premier appel de Module.compile (...). Si NullPointerException n'est pas lancé à partir de SyspathJavaLoader.loadClass() Vous avez été des plus utiles. Maintenant tout ce que j'ai à faire est de l'intégrer dans un pool de scripts dynamiquement redimensionnable ... – nEJC
Connaissez-vous un équivalent pour Jython 2.5? – Laurent
@Laurent - non, je n'ai pas regardé cette zone depuis que j'ai posté cette réponse – McDowell