2010-11-19 25 views
5

Một số điều ẩn phổ biến có thể gây tắc nghẽn đa luồng/song song trong Jython là gì? Tôi có một số mã song song (sử dụng thư viện luồng Python) sẽ không quy mô qua 3-4 CPU, và tôi chắc chắn rằng nó không phải vì bất kỳ những cạm bẫy rõ ràng:Hidden Multithreading Bottlenecks trong Jython?

  • khóa Explicit

  • Calling mã thư viện mà yêu cầu đồng bộ hóa (thuật toán tôi đang cố gắng để parallelize được về cơ bản được viết từ đầu và không sử dụng bất kỳ thư viện.)

về cơ bản tất cả các thuật toán thực hiện là một loạt các xử lý chuỗi, danh sách và tra cứu từ điển và toán học. Sự hiểu biết của tôi là, không giống như CPython, Jython không có GIL.

+0

Tôi sẽ kiểm tra xem liệu bộ sưu tập rác có gây tổn hại cho bạn ở cấp JVM hay không. Tài liệu này có rất nhiều thông tin về điều đó: http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html –

Trả lời

3

Jython không có GIL, nhưng khá khó để có được nhiều tính song song. Nếu bạn có bất kỳ phần nào không thể thực hiện song song, bạn bị cắn bởi Ahmdahl's Law:

Việc tăng tốc chương trình sử dụng nhiều bộ xử lý song song bị giới hạn bởi thời gian cần thiết cho phần tuần tự của chương trình .

Hơn nữa, ngay cả khi bạn thực hiện hoàn toàn tính toán song song, bạn sẽ bị những thứ khác cắn, như căng thẳng bộ nhớ cache. Cũng nên nhớ rằng mã của bạn đang chạy trên một máy ảo, vì vậy ngay cả khi mã của bạn hoàn toàn song song, JVM có thể có một số phối hợp nội bộ giữ bạn lại (thu gom rác thải là một ứng cử viên rõ ràng).

4

Truy cập biến là một trong những tắc nghẽn "ẩn" đó. Nếu tất cả các chủ đề truy cập một số cơ sở hạ tầng được chia sẻ (s) sẽ có sự đồng bộ giữa các luồng.

Jython cố gắng hết sức để đạt được khả năng tương thích ngôn ngữ với CPython. Một điều mà GIL đảm bảo là truy cập vào các biến cục bộ/toàn cầu, các thành viên đối tượng, các phần tử dict (các địa phương kỹ thuật, các hình cầu và các thành phần đối tượng cũng là các phần tử dict) hoặc thậm chí các phần tử danh sách đều là nguyên tử. Để tránh những bất ngờ cho người dùng, Jython sử dụng một bản đồ băm đồng thời để thực hiện các dicts. Điều này có nghĩa rằng có một số đồng bộ đang diễn ra khi truy cập bất kỳ loại phần tử dict nào trong Jython. Sycnhronization này là sọc để hỗ trợ truy cập vào dict từ nhiều chủ đề mà không chặn chúng, nhưng nếu nhiều chủ đề truy cập cùng một biến họ sẽ nhấn cùng một khóa.

Cách tốt nhất để đạt được khả năng mở rộng trong Jython và bất kỳ ngôn ngữ nào khác, là đảm bảo rằng dữ liệu bạn đang truy cập trong mỗi chuỗi không được truy cập từ các chủ đề khác.

1

Bạn đã thử bất kỳ gói nào performance analysis? Ngay cả khi họ không rõ ràng cho Jython tôi đặt cược nó sẽ cung cấp một số trợ giúp.

Tôi muốn thử YourKit trước tiên nếu bạn có quyền truy cập vào giấy phép.