Estoy construyendo un marco en Java que escuchará eventos y luego los procesará en Jython. Se enviarán diferentes tipos de eventos a diferentes scripts.¿Cómo se ejecutan guiones jython multiproceso desde Java?
Dado que jython tarda bastante tiempo en compilar la secuencia de comandos cuando se llama a PythonInterpreter.exec(), tendré que precompilar las secuencias de comandos. Lo estoy haciendo la siguiente manera:
// 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");
El objeto PyCode compilado sería empujado al repositorio y se utiliza como eventos vienen en
PythonInterpreter pi = new PythonInterpreter();
pi.set("variable_1", "value_1");
pi.set("variable_x", "value_x");
pi.exec(compiled);
Ahora para mi dilema - que podría suceder que hay múltiples eventos de cierto tipo que suceden al mismo tiempo; por lo tanto, varias instancias de script se ejecutan al mismo tiempo.
Casi todas las secuencias de comandos probablemente seguirán siendo efímeras: hasta 100 líneas, sin bucles. El número y la frecuencia son completamente aleatorios (eventos generados por el usuario) y pueden ser de 0 a aproximadamente 200 por segundo por tipo de evento.
¿Cuál sería la mejor manera de hacerlo? Estoy viendo algunas posibilidades:
- uso de sincronización en el punto de evento de disparo - esto impediría varias instancias del mismo guión, sino también eventos no sería procesado tan pronto como deberían ser
- crear una agrupación del mismo tipo de scripts poblados de alguna manera al clonar el objeto PyCode original - el mayor problema sería optimizar los tamaños del grupo
- clonar dinámicamente el objeto del script del padre siempre que sea necesario y luego descartarlo cuando exec() finalice - de esta forma se elimina el retraso de compilar pero todavía está presente en el método de clonación
Probablemente la combinación de los números 2 y 3 sería la mejor: ¿creará tamaños de grupo dinámicos?
¿Alguna idea? ;)
¡Guau! Funciona como un amuleto;) Debe tenerse en cuenta que se debe crear una instancia de PythonInterpreter antes de llamar a Module.compile (...). Si no se lanza NullPointerException desde SyspathJavaLoader.loadClass() Has sido de lo más útil. Ahora todo lo que tengo que hacer es integrar esto en un conjunto de scripts dinámicamente redimensionable ... – nEJC
¿Conoces algún equivalente para Jython 2.5? – Laurent
@Laurent - no, no he visto esta área desde que publiqué esta respuesta – McDowell