java - ¿Cuál es la semántica de similitud y ciclo de vida de Rhino Script Engine?
concurrency lifecycle (1)
Estoy interesado en la semántica del ciclo de vida y la concurrencia de (Rhino) Script Engine y las clases asociadas. Específicamente:
- ¿Se supone que los
Bindings
son seguros para hilos? - ¿Deberían permitirse varios subprocesos para compartir una sola instancia de ScriptEngine?
- ... o debería cada hilo construir una instancia de corta duración?
- ... o mantenerlos en una piscina?
- ¿Qué sucede si varios subprocesos llaman simultáneamente a
ScriptEngine.eval(...)
? - Las mismas preguntas para instancias de
CompiledScript
- Las mismas preguntas para las implementaciones de interfaz generadas usando
Invocable.getInterface(...)
? - Presumiblemente, los objetos colocados en Vinculaciones siguen la recolección de basura de Java. ¿Qué pasa con la recolección de basura de objetos que no terminan en los enlaces?
Así que ejecuté el experimento y el motor de Rhino informa que "Mozilla Rhino" está MULTITHREADED, lo que afirma el JavaDocs
"MULTITHEADED": la implementación del motor es internamente segura para subprocesos y los scripts pueden ejecutarse simultáneamente, aunque los efectos de la ejecución del script en un subproceso pueden ser visibles para los scripts en otros subprocesos ".
Aquí está el código ... me parece seguro para hilos, siempre y cuando los enlaces que pase sean también seguros para hilos.
package org.rekdev;
import java.util.*;
import javax.script.*;
public class JavaScriptWTF {
public static void main( String[] args ) {
ScriptEngineManager mgr = new ScriptEngineManager();
List<ScriptEngineFactory> factories = mgr.getEngineFactories();
for ( ScriptEngineFactory factory : factories ) {
System.out.println( String.format(
"engineName: %s, THREADING: %s",
factory.getEngineName(),
factory.getParameter( "THREADING" ) ) );
}
}
}
... la salida es ...
engineName: AppleScriptEngine, ROSCADO: nulo
motorNombre: Mozilla Rhino, HILO: MULTIJUO
Para responder a su pregunta exacta ...
¿Se supone que los enlaces son seguros para hilos?
Me parece que es tu responsabilidad hacer que sean seguros para subprocesos. En otras palabras, pase solo objetos inmutables y si el motor es Thread-safe o no se convierte en un problema.¿Deberían permitirse varios subprocesos para compartir una sola instancia de ScriptEngine?
Me parece que pueden, pero la clave es el intercambio de estado que puede ocurrir a través de los enlaces. Los objetos inmutables son tus amigos.... o debería cada hilo construir una instancia de corta duración?
Me parece que la mejor manera de pensar esto es que cada ejecución de eval es una instancia de corta duración.... o mantenerlos en una piscina?
En este día y en la era, intentar agrupar recursos por su cuenta rara vez es una buena idea. Déle un tiro a la instancia de corta duración, mida su rendimiento y trabaje desde allí.¿Qué sucede si varios subprocesos llaman simultáneamente a ScriptEngine.eval (...)?
Si entiendo la respuesta del motor Rhino a MULTITHREADING correctamente, ScriptEngine.eval debería estar bien con las llamadas concurrentes.La misma pregunta para las instancias de CompiledScript
Los JavaDocs indican que "Los cambios en el estado del ScriptEngine causados por la ejecución del CompiledScript pueden ser visibles durante las ejecuciones posteriores de los scripts por parte del motor". http://docs.oracle.com/javase/6/docs/api/javax/script/CompiledScript.html . Por lo tanto, no suenan Thread-safe en un entorno en el que parece que intentas minimizar el número de instancias de ScriptEngine.Las mismas preguntas para las implementaciones de interfaz generadas usando Invocable.getInterface (...)? Estás solo aquí. No entiendo exactamente por qué o cuándo se usaría esta capacidad y me suena como si estuvieras "saltando el tiburón" aquí. Si quieres profundizar en el lenguaje de scripting, te recomiendo que abandones JavaScript y busques en Groovy un Java más compatible con scripts.
Presumiblemente, los objetos colocados en Vinculaciones siguen la recolección de basura de Java. ¿Qué pasa con la recolección de basura de objetos que no terminan en los enlaces?
Si no terminan en enlaces, espero que estén vinculados al ScriptEngine y sigan su ciclo de vida (según los documentos que he leído). Combinar las instancias de ScriptEngine no parece una gran idea.