Sto costruendo un framework in Java che ascolterà gli eventi e li elaborerà in Jython. Diversi tipi di eventi verranno inviati a diversi script.Come script jython multithreading in esecuzione da java?
Poiché jython richiede un po 'di tempo per compilare lo script quando viene chiamato PythonInterpreter.exec(), dovrò precompilare gli script. Lo sto facendo in questo modo:
// 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'oggetto PyCode compilato sarebbe spinto a repository e utilizzato come eventi sono disponibili in
PythonInterpreter pi = new PythonInterpreter();
pi.set("variable_1", "value_1");
pi.set("variable_x", "value_x");
pi.exec(compiled);
Ora per la mia enigma - può succedere che ci sono più eventi di un certo tipo che si verificano nello stesso momento - quindi più istanze di script eseguite nello stesso momento.
Quasi tutti gli script probabilmente rimarranno di breve durata - fino a 100 righe, senza loop. Il numero e la frequenza sono completamente casuali (eventi generati dall'utente) e potrebbero variare da 0 a circa 200 al secondo per tipo di evento.
Quale sarebbe il modo migliore per farlo? Sto guardando un paio di possibilità: la sincronizzazione
- uso al punto di trigger event - ciò impedirebbe più istanze dello stesso script, ma anche eventi non sarebbe stato elaborato nel più breve tempo dovrebbero essere
- creare un pool dello stesso tipo di script popolato in qualche modo dalla clonazione dell'oggetto PyCode originale - il problema più grande probabilmente sarebbe l'ottimizzazione delle dimensioni del pool
- clonare dinamicamente l'oggetto script dal genitore ogni volta che è necessario e quindi scartarlo quando exec() termina - in questo modo viene rimosso il lag da compilare ma è ancora presente nel metodo clone
Probabilmente la combinazione dei numeri 2 e 3 sarebbe la migliore - creazione di dimensioni di piscine dinamiche?
Quindi, qualche idea? ;)
Bello! Funziona come un fascino;) Si noti che un'istanza di PythonInterpreter DEVE essere creata prima che venga chiamato Module.compile (...). Se non NullPointerException viene generato da SyspathJavaLoader.loadClass() Sei stato molto utile. Ora tutto ciò che devo fare è integrarlo in un pool di script dinamicamente ridimensionabile ... – nEJC
Conosci qualche equivalente per Jython 2.5? – Laurent
@Laurent - no, non ho guardato quest'area da quando ho postato questa risposta – McDowell