2011-08-04 10 views
30

Tôi quan tâm đến vòng đời và ngữ nghĩa đồng thời của (Rhino) Script Engine và các lớp liên quan. Cụ thể:Vòng đời và ngữ nghĩa đồng thời của Rhino Script Engine

  1. Có phải là sợi chỉ an toàn không?
  2. Có nên cho phép nhiều luồng để chia sẻ một cá thể ScriptEngine không?
  3. ... hoặc mỗi chuỗi sẽ tạo một phiên bản ngắn ngủi?
  4. ... hoặc giữ chúng trong hồ bơi?
  5. Điều gì xảy ra nếu nhiều chủ đề đồng thời gọi ScriptEngine.eval(...)?
  6. Các câu hỏi tương tự cho CompiledScript trường hợp
  7. Các câu hỏi tương tự cho việc triển khai giao diện được tạo bằng cách sử dụng Invocable.getInterface(...)?
  8. Có lẽ, các đối tượng được đặt trong Bindings theo bộ sưu tập rác của Java. Còn về việc thu gom rác của các đồ vật không kết thúc trong các ràng buộc thì sao?
+2

Tôi không biết, nhưng JavaDocs đề xuất rằng bạn có thể yêu cầu triển khai đảm bảo an toàn chủ đề của nó: http: //download.oracle.com/javase/6/docs/api/javax/script/ ScriptEngineFactory.html # getParameter (java.lang.String) xem phương thức getParameter và chơi với THREADING. –

Trả lời

23

Vì vậy, tôi đã chạy các báo cáo cơ Rhino thử nghiệm và "Mozilla Rhino" là đa luồng mà JavaDocs khẳng định

"đa luồng" - Việc thực hiện cơ là nội thread-safe và các kịch bản có thể thực hiện đồng thời mặc dù ảnh hưởng của kịch bản thực hiện trên một thread có thể được hiển thị cho các kịch bản về đề khác."

Dưới đây là các mã ... nó trông threadsafe với tôi, miễn là các ràng buộc bạn vượt qua trong ar e threadsafe quá.

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

... đầu ra là ...

engineName: AppleScriptEngine, Threading: null
engineName: Mozilla Rhino, Threading: multithreaded

Để trả lời chính xác của bạn câu hỏi ...

  1. Bindings có phải là luồng an toàn không?
    Nghe có vẻ với tôi rằng bạn có trách nhiệm đảm bảo an toàn cho Chủ đề. Nói cách khác, chỉ truyền những vật thể không thay đổi được và cho dù động cơ có an toàn Chủ đề hay không trở thành không có vấn đề.

  2. Có nên cho phép nhiều luồng để chia sẻ một cá thể ScriptEngine không?
    Nghe có vẻ như tôi có thể, nhưng điều quan trọng là chia sẻ trạng thái có thể xảy ra thông qua Bindings. Các đối tượng không thể thay đổi là bạn của bạn.

  3. ... hoặc mỗi chuỗi sẽ tạo một phiên bản ngắn ngủi?
    Dường như với tôi rằng cách tốt nhất để nghĩ về điều này là mỗi lần thực hiện eval là một ví dụ ngắn ngủi.

  4. ... hoặc giữ chúng trong hồ bơi?
    Trong ngày và tuổi này, cố gắng tự mình tự mình tìm tài nguyên trong hồ bơi thì hiếm khi là một ý tưởng hay. Cung cấp cho một trường hợp ngắn ngủi một shot, đo lường hiệu suất của nó, và làm việc ra khỏi đó.

  5. Điều gì sẽ xảy ra nếu nhiều chủ đề đồng thời gọi ScriptEngine.eval (...)?
    Nếu tôi hiểu sự giải mã của công cụ Rhino để MULTITHREADING chính xác, ScriptEngine.eval sẽ ổn với các cuộc gọi đồng thời.

  6. Câu hỏi tương tự cho các phiên bản CompiledScript
    Trạng thái JavaDocs rằng "Thay đổi trạng thái của ScriptEngine do thực thi CompiledScript có thể hiển thị trong khi thực thi các tập lệnh sau đó." http://docs.oracle.com/javase/6/docs/api/javax/script/CompiledScript.html. Vì vậy, họ không âm thanh Thread an toàn ở tất cả trong một môi trường mà bạn dường như đang cố gắng để giảm thiểu số lượng các trường hợp ScriptEngine.

  7. Các câu hỏi tương tự cho việc triển khai giao diện được tạo bằng Invocable.getInterface (...)? Bạn đang ở đây một mình. Tôi không hiểu chính xác lý do tại sao hoặc khi nào khả năng này sẽ được sử dụng và nó có vẻ như tôi có thể là "nhảy cá mập" ở đây. Nếu bạn muốn đi sâu hơn vào ngôn ngữ kịch bản, tôi khuyên bạn nên bỏ JavaScript và xem Groovy cho một Java dễ đọc hơn.

  8. Có lẽ, các đối tượng được đặt trong Bindings theo dõi bộ sưu tập rác của Java. Còn về việc thu gom rác của các đồ vật không kết thúc trong các ràng buộc thì sao?
    Nếu chúng không kết thúc trong các ràng buộc, tôi mong đợi chúng bị ràng buộc với ScriptEngine và tuân theo vòng đời của nó (dựa trên các tài liệu mà tôi đã đọc). Việc gộp các phiên bản ScriptEngine không giống như một ý tưởng tuyệt vời.

+0

Tôi muốn có một câu trả lời dứt khoát hơn về việc gộp nhóm và khởi tạo, nhưng bạn đã bao quát hầu hết mọi thứ. Cảm ơn bạn đã nghiên cứu. –