2013-06-08 49 views
27

Tôi có một "lớp kịch bản" trong IronPython và kịch bản trong ứng dụng của tôi hoạt động bằng cách gọi các phương thức trên cá thể của nó. Tôi cần triển khai các kịch bản lệnh gọi từ nhiều luồng. Cách chính xác để làm điều đó là gì?Đa luồng trong IronPython

Tôi có nhiều mối quan tâm:

  1. ScriptScope thread-an toàn không? Thông tin là mâu thuẫn. ScriptScope's documentation says: "ScriptScope không phải là chủ đề an toàn. Máy chủ phải khóa khi nhiều luồng có thể truy cập cùng một mô-đun hoặc phải tạo bản sao cho từng chuỗi." Tuy nhiên, IronRuby sử dụng cùng một DLR và @JimmySchementi says rằng "ScriptRuntime, ScriptEngine và ScriptScope là tất cả các chủ đề an toàn, được thiết kế để sử dụng giữa các luồng. Cụ thể, ScriptScope sử dụng một kho lưu trữ dữ liệu an toàn, vì vậy ScriptScope có thể được chia sẻ giữa các luồng . "

  2. Nếu tôi tạo nhiều ScriptScope s, điều đó có nghĩa là thực hiện cùng một tập lệnh khởi tạo nhiều lần. Giả sử rằng tôi chạy mười tệp kịch bản lệnh Python, nhập năm tập hợp và trên toàn bộ thực thi khá một chút mã để có được "đối tượng kịch bản" sẵn sàng. Có cách nào để tránh thời gian và chi phí bộ nhớ của việc chạy nhiều mã giống nhau cho mỗi luồng không?

  3. Đang tạo ScriptScope biến tĩnh-tĩnh (có nghĩa là, áp dụng ThreadStaticAttribute) và thực hiện khởi tạo cho mỗi chuỗi được sử dụng bởi Task.Run cách để đi? Hoặc tôi có nên sử dụng một số TaskScheduler với giới hạn đồng thời không, bởi vì chi phí của nhiều phạm vi cao?

Toàn bộ: cách triển khai chính xác cùng một tập lệnh trên các đối số khác nhau trong nhiều chuỗi? Các tập lệnh phải được thực hiện đồng thời và không được sụp đổ do điều kiện chủng tộc.

+3

Tôi cảm thấy cho bạn. Tôi tìm thấy tài liệu về cả hai phần mềm độc hại và thiếu sắt trong mọi khía cạnh kể từ khi Microsoft ngừng chính thức hỗ trợ nó. –

Trả lời

-1

Vì, có vẻ như bạn đang nhận được câu trả lời cụ thể, tôi có câu trả lời chung.

Một đồng nghiệp của tôi đã sử dụng IronPhython trong công việc trước đây của tôi và xử lý đa luồng sẽ là cần thiết, vì vậy tôi có thể nói rằng có thể chạy IronPython trong môi trường đa luồng trên hệ thống sản xuất.

Tôi không biết liệu anh ấy có sử dụng khóa của riêng mình hay phụ thuộc vào khóa trong IronPython hay không.

Tôi muốn đề xuất:

a) Tự chạy thử nghiệm. Bạn sẽ có thể viết một bài kiểm tra đơn giản để chứng minh xem nó có an toàn hay không. Nội dung thô sơ như mã sau có thể là một khởi đầu tốt:

[Test] 
    public void TwoThreadsWithTheirOwnContexts() { 
     //Create two threads 
     var tasks = new Task[2]; 
     tasks[0] = Task.Factory.StartNew(PrintSomethingInIronPython1); 
     tasks[1] = Task.Factory.StartNew(PrintSomethingInIronPython2); 
     Task.WaitAll(tasks); 
    } 

b) Thêm khóa. Nó có thể không phải là một vấn đề lớn để có khóa thực hiện trong mã của bạn và bạn sẽ loại bỏ sự không chắc chắn.

Cuối cùng nếu các tài liệu nói điều gì đó không an toàn cho luồng, bạn sẽ phải chứng minh đó là (kiểm tra) hoặc chơi an toàn (khóa của riêng bạn). Không có vấn đề gì, có thử nghiệm đa luồng nên được thực hiện trước khi bạn đi vào sản xuất anyway. Tôi không nghĩ rằng bạn thực sự mất thời gian bằng cách thực hiện chúng ngay từ đầu.

Re 2: Chỉ đề xuất lại. Tạo một chủ đề hồ bơi mà khởi tạo một lần và sau đó tái sử dụng các chủ đề này.

+2

Tôi không nghĩ rằng an toàn chủ đề có thể được xác minh bằng các bài kiểm tra đơn vị. –

+0

@JeffreyZhao Đồng ý - chủ đề an toàn là chất lượng nội tại của một cái gì đó, không phải là một đơn vị testcase. – data

2

1.

Nếu tài liệu của ScriptScope nói nó không phải là chủ đề an toàn, tin rằng nó, hoặc ít nhất là hành động như bạn tin điều đó. @JimmySchementi có thể đã xem xét việc thực hiện hiện tại và làm việc ra rằng nó hiện là chủ đề an toàn, nhưng điều này không đảm bảo về cách nó sẽ hành xử trong bản vá tiếp theo của lớp, hãy để một mình phát hành lớn tiếp theo.

2.

Có bạn sẽ cần phải khởi tạo mỗi ScriptScopes của bạn. Tôi sẽ cố gắng và giảm thiểu số lượng ScriptScopes bạn yêu cầu, làm thế nào để làm điều này sẽ phụ thuộc vào thiết lập của bạn. Nếu mục đích chính của các chủ đề liên quan là để lưu trữ một ScriptScope thì bạn nên sử dụng một ThreadPool với mỗi luồng có một ThreadLocal < ScriptScope>. Nếu các chủ đề này đang làm những việc khác cũng như chạy tập lệnh thì bạn nên có một nhóm đối tượng lưu trữ ScriptScopes và mỗi luồng có thể kiểm tra ScriptScopes, thực hiện công việc, sau đó thả ScriptScope.

3.

thích ThreadLocal qua ThreadStatic nếu bạn đi xuống con đường này.

0

Đây là cách bạn thực hiện trong kịch bản, Nếu tôi hiểu chính xác bạn.

https://github.com/dretax/Python-Plugins/blob/master/PlutonPlugins/PluIRC/PluIRC.py#L154

Xem những gì kịch bản mà không, Nó hoàn toàn ra mắt một chủ đề mới trong những điều tương tự, với lập luận khác nhau.

Tệp py bạn có thể thấy nếu HOÀN TOÀN có ren và sử dụng IronPython. Đó là CÁCH bạn làm chủ đề chính xác và KHÔNG theo bất kỳ cách nào khác.