30 votes

Quel est le cycle de la vie et de la simultanéité de la sémantique de Rhino Moteur de Script

Je suis intéressé dans le cycle de la vie et de la simultanéité de la sémantique de (Rhino) Moteur de Script et les classes associées. Plus précisément:

  1. Est - Bindings censé être thread-safe?
  2. Si plusieurs threads être autorisé à partager un seul ScriptEngine exemple?
  3. ... ou devrais-chaque thread construire une courte durée de vie de l'instance?
  4. ... ou les garder dans une piscine?
  5. Qu'advient-il si plusieurs threads simultanément appel ScriptEngine.eval(...)?
  6. Mêmes questions pour CompiledScript cas
  7. Mêmes questions pour les implémentations d'interface générée à l'aide de Invocable.getInterface(...)?
  8. Sans doute, les objets placés dans les Liaisons suivre Java collecte des ordures. Ce sujet de la collecte des ordures des objets qui ne se retrouvent pas dans les liaisons?

23voto

Bob Kuhar Points 3502

Donc, j'ai couru l'expérience et le Rhino moteur de rapports "Mozilla Rhino" est MULTITHREAD qui les JavaDocs affirme

"MULTITHREAD" - Le moteur de la mise en œuvre est à l'intérieur de thread-safe et les scripts peuvent exécuter en même temps que bien que les effets de script l'exécution sur un seul thread peut être visible à des scripts sur d'autres threads."

Voici le code...c'est thread-safe pour moi, tant que les liaisons que vous transmettez sont thread-safe trop.

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 sortie est...

engineName: AppleScriptEngine, FILETAGE: null
engineName: Mozilla Rhino, FILETAGE: MULTITHREAD

Pour répondre à votre question exacte...

  1. Est Fixations censées être thread-safe?
    Il me semble qu'il est de votre responsabilité de les rendre Thread-safe. En d'autres termes, passer seulement des objets immuables et si le moteur est Thread-safe ou pas devient un non-problème.

  2. Si plusieurs threads être autorisé à partager un seul ScriptEngine exemple?
    Il me semble qu'ils peuvent, mais la clé est l'état de partage qui peut se produire via les Liaisons. Des objets immuables sont à votre ami.

  3. ...ou devrais-chaque thread construire une courte durée de vie de l'instance?
    Il me semble que la meilleure façon de penser, c'est que chaque exécution de la fonction eval est une courte durée de l'instance.

  4. ... ou les garder dans une piscine?
    En cette journée et l'âge de la tentative de pool de ressources sur votre propre est rarement une bonne idée. Donner la courte durée de l'instance d'un coup, de mesurer ses performances, et à partir de là.

  5. Qu'advient-il si plusieurs threads simultanément appel ScriptEngine.eval(...)?
    Si je comprends le Rhino du moteur repsonse pour le MULTITHREADING correctement, ScriptEngine.eval doit être fine avec appels simultanés.

  6. Même question pour CompiledScript instances
    La Javadoc de l'état que "les Changements dans l'état de la ScriptEngine causés par l'exécution de la CompiledScript peut visible lors des exécutions de scripts par le moteur." http://docs.oracle.com/javase/6/docs/api/javax/script/CompiledScript.html. De sorte qu'ils ne sonnent pas Thread-safe à tous dans un environnement où vous semblent être en train d'essayer de minimiser le nombre de ScriptEngine instances.

  7. Mêmes questions pour les implémentations d'interface générée à l'aide de Opposables.getInterface(...)? Vous êtes sur votre propre ici. Je ne comprends pas exactement pourquoi ou quand cette fonctionnalité sera utilisé et il me semble que vous peut-être "jumping the shark" ici. Si vous voulez aller en profondeur dans le langage de script, je vous recommande d'abandonner JavaScript et de regarder Groovy pour une plus des scripts Java.

  8. Sans doute, les objets placés dans les Liaisons suivre Java collecte des ordures. Ce sujet de la collecte des ordures des objets qui ne se retrouvent pas dans les liaisons?
    Si ils ne finissent pas dans les liaisons je m'attends à être lié à la ScriptEngine et de suivre son cycle de vie (basée sur les docs que j'ai lu). La mise en commun des ScriptEngine instances ne sonne pas comme une grande idée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X