2011-08-04 5 views
30

Interesuje mnie semantyka cyklu życia i współbieżności w silniku skryptowym (Rhino) i powiązanych klasach. W szczególności:Co to jest semantyka cyklu życiowego i współbieżności w silniku skryptowym Rhino?

  1. Czy Bindings ma być bezpieczny dla wątków?
  2. Czy wiele wątków może mieć współużytkowaną pojedynczą instancję ScriptEngine?
  3. ... czy też każdy wątek powinien utworzyć krótkotrwałe wystąpienie?
  4. ... lub zatrzymać je w basenie?
  5. Co się stanie, jeśli wiele wątków jednocześnie będzie wywoływać ScriptEngine.eval(...)?
  6. To samo pytanie dla instancji CompiledScript instancji
  7. Te same pytania dotyczące implementacji interfejsu wygenerowanych za pomocą Invocable.getInterface(...)?
  8. Przypuszczalnie obiekty umieszczone w powiązaniach są zgodne ze zbiorem śmieci Javy. A co z wyrzucaniem śmieci z obiektów, które nie trafiają do wiązań?
+2

Nie wiem, ale Javadocs sugerują, że można poprosić o jego wykonanie gwarantuje bezpieczeństwo wątku: http: //download.oracle.com/javase/6/docs/api/javax/script/ ScriptEngineFactory.html # getParameter (java.lang.String) spójrz na metodę getParameter i graj z GWINTOWANIEM. –

Odpowiedz

23

Więc Zabrakło mi eksperyment i raporty silnik Rhino „Mozilla Rhino” to wielowątkowy których Javadocs twierdzi

„wielowątkowy” - Realizacja silnik jest wewnętrznie bezpieczny wątku i skrypty mogą wykonać równocześnie chociaż efekty skryptu wykonanie na jednym wątku może być widoczne dla skryptów w innych wątkach.”

Oto kod ... wygląda threadsafe do mnie, tak długo, jak wiązania przechodzą w miejscach e także wątki bezpieczne.

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"))); 
     } 
    } 
} 

... wyjście jest ...

engineName: AppleScriptEngine, gwintowania: null
engineName: Mozilla Rhino, gwintowania: wielowątkowych

Aby odpowiedzieć na to dokładna pytanie ...

  1. Czy wiązania powinny być bezpieczne dla wątków?
    Wydaje mi się, że Twoim obowiązkiem jest sprawić, by były bezpieczne dla wątków. Innymi słowy, przekazuj tylko niezmienne obiekty i czy silnik jest bezpieczny dla wątków, czy też nie, nie jest problemem.

  2. Czy wiele wątków może mieć współużytkowaną pojedynczą instancję ScriptEngine?
    To brzmi dla mnie tak, jak mogą, ale kluczem jest dzielenie się stanem, które może nastąpić poprzez Wiązania. Niezmienne przedmioty są twoim przyjacielem.

  3. ... czy też każdy wątek powinien utworzyć krótkotrwałe wystąpienie?
    Wydaje mi się, że najlepszym sposobem na myślenie o tym jest to, że każda egzekucja ewalu jest krótkotrwałym instancją.

  4. ... lub zatrzymać je w basenie?
    W dzisiejszych czasach próba samodzielnego łączenia zasobów rzadko jest dobrym pomysłem. Daj krótkotrwałą instancję ujęcie, zmierz jego wydajność i stamtąd.

  5. Co się dzieje, gdy wiele wątków jednocześnie wywołuje ScriptEngine.eval (...)?
    Jeśli rozumiem, że reparse silnika Rhino poprawnie działa MULTITHREADING, skrypt ScriptEngine.eval powinien działać poprawnie przy jednoczesnych połączeniach.

  6. samo pytanie o przypadkach CompiledScript
    W Javadocs stwierdzić, że „Zmiany stanu ScriptEngine spowodowane realizacją CompiledScript może widoczne podczas kolejnych egzekucji skryptów przez silnik.” http://docs.oracle.com/javase/6/docs/api/javax/script/CompiledScript.html. Więc nie brzmią one w ogóle bez wątków w środowisku, w którym wydaje się, że próbujesz zminimalizować liczbę instancji ScriptEngine.

  7. To samo pytanie dla implementacji interfejsu wygenerowane za pomocą Invocable.getInterface (...)? Jesteś tutaj sam. Nie rozumiem dokładnie, dlaczego i kiedy ta zdolność zostanie użyta i brzmi dla mnie tak, jakbyś mógł "skakać rekina" tutaj. Jeśli chcesz zagłębić się w język skryptowy, polecam zrezygnować z JavaScript i spojrzeć na Groovy na bardziej skryptowalną Javę.

  8. Przypuszczalnie obiekty umieszczone w powiązaniach są śledzone przez moduł Java. A co z wyrzucaniem śmieci z obiektów, które nie trafiają do wiązań?
    Jeśli nie znajdą się w wiązaniach, oczekuję, że będą związani z ScriptEngine i śledzą cykl życia (na podstawie dokumentów, które przeczytałem). Łączenie instancji ScriptEngine nie brzmi jak świetny pomysł.

+0

Chciałbym bardziej zdecydowaną odpowiedź na temat łączenia vs tworzenia instancji, ale większość z nich pokrywałaś. Dziękuję za twoje badania. –