Tại sao không có GIL trong Máy ảo Java? Tại sao Python cần một cái quá tệ?


177

Tôi hy vọng ai đó có thể cung cấp một số thông tin chi tiết về những gì khác biệt cơ bản về Máy ảo Java cho phép nó triển khai các luồng độc đáo mà không cần Khóa phiên dịch toàn cầu (GIL), trong khi Python cần một điều ác như vậy.

Câu trả lời:


223

Python (ngôn ngữ) không cần GIL (đó là lý do tại sao nó có thể được triển khai hoàn hảo trên JVM [Jython] và .NET [IronPython] và các triển khai đó đa luồng một cách tự do). CPython (triển khai phổ biến) luôn sử dụng GIL để dễ mã hóa (đặc biệt là mã hóa các cơ chế thu gom rác) và tích hợp các thư viện mã hóa C không an toàn (thường có rất nhiều thư viện xung quanh; -).

Các không tải Swallow dự án, trong số những mục tiêu đầy tham vọng khác, không có kế hoạch một máy ảo GIL-miễn phí cho Python -. Để trích dẫn trang web đó, "Bên cạnh đó, chúng tôi dự định để loại bỏ các GIL và sửa chữa tình trạng đa luồng bằng Python Chúng tôi tin rằng đây là có thể thông qua việc triển khai một hệ thống GC tinh vi hơn, giống như Recycler của IBM (Bacon et al, 2001). "


6
Alex, những gì về những nỗ lực cũ để loại bỏ GIL, không có quá nhiều chi phí với điều đó (hệ số 2 là những gì tôi nhớ lại)?
Bartosz Radaczyński

10
Có Bartosz, Greg Stein đã đo lường điều đó vào năm 1999. Bộ sưu tập rác bằng cách đếm tham chiếu là kẻ giết người, buộc chi phí rất lớn của khóa hạt mịn. Đó là lý do tại sao một GC tiên tiến hơn là rất quan trọng ở đó.
Alex Martelli

80
Nhóm Swallow Unladen đã từ bỏ việc loại bỏ GIL: code.google.com/p/unladen-swallow/wiki/
mẹo

1
Các lựa chọn thay thế cho Unladen và CPython là PyPy, Jython và IronPython. Hai cái sau không có GIL, nhưng sử dụng mô-đun đa xử lý vượt qua GIL và dù sao cũng an toàn hơn.
Cees Timmerman

50

JVM (ít nhất là điểm nóng) có khái niệm tương tự như "GIL", nó chỉ tinh vi hơn về độ chi tiết khóa của nó, hầu hết điều này đến từ các điểm nóng của GC tiên tiến hơn.

Trong CPython, đó là một khóa lớn (có thể không đúng, nhưng đủ tốt để tranh luận), trong JVM, nó lan truyền nhiều hơn với các khái niệm khác nhau tùy thuộc vào nơi nó được sử dụng.

Hãy xem, ví dụ, vm / runtime / safepoint.hpp trong mã hotspot, đây thực sự là một rào cản. Một lần tại một điểm an toàn, toàn bộ VM đã dừng liên quan đến mã java, giống như VM python dừng tại GIL.

Trong thế giới Java, các sự kiện tạm dừng VM như vậy được gọi là "thế giới dừng", tại các điểm này chỉ có mã gốc bị ràng buộc với các tiêu chí nhất định là chạy miễn phí, phần còn lại của VM đã bị dừng.

Ngoài ra, việc thiếu khóa thô trong java khiến JNI khó viết hơn nhiều, vì JVM không đảm bảo về môi trường của nó đối với các cuộc gọi FFI, một trong những điều mà cpython thực hiện khá dễ dàng (mặc dù không dễ như sử dụng ctypes).


7

Có một bình luận bên dưới trong bài đăng trên blog này http://www.grouplens.org/node/244 gợi ý lý do tại sao nó lại dễ dàng phân phối với GIL cho IronPython hoặc Jython, đó là CPython sử dụng tính năng tham chiếu trong khi 2 VM còn lại có bộ thu gom rác.

Các cơ chế chính xác về lý do tại sao điều này là do tôi không nhận được, nhưng nó có vẻ như là một lý do chính đáng.


5
Khi bạn chia sẻ các đối tượng một cách bừa bãi giữa các luồng, làm việc khi không ai có tham chiếu đến một đối tượng cụ thể nào nữa thì thật khó xử. Đếm tham chiếu với khóa toàn cầu là một cách (đắt tiền). Một cách khác để giải quyết nó là chỉ để một luồng tại một thời điểm giữ các tham chiếu đến đối tượng, điều này sẽ làm cho hầu hết các hoạt động trở thành luồng cục bộ với chi phí khiến việc liên lạc giữa các luồng trở nên khó xử hơn. Cá nhân, tôi nghĩ rằng nó nói rằng HPC sử dụng chuyển tin nhắn giữa các bộ xử lý và không chia sẻ bộ nhớ, và nó làm như vậy vì lý do khả năng mở rộng ...
Donal Fellows

0

Trong liên kết này, họ có lời giải thích sau đây:

... "Các bộ phận của Trình thông dịch không bảo vệ luồng, mặc dù chủ yếu là vì làm cho tất cả các luồng an toàn bằng cách sử dụng khóa lớn sẽ làm chậm luồng đơn cực kỳ ( nguồn ). Điều này dường như có liên quan đến trình thu gom rác CPython bằng cách sử dụng tính năng tham chiếu (JVM và CLR thì không, và do đó không cần phải khóa / giải phóng số tham chiếu mỗi lần). Nhưng ngay cả khi ai đó nghĩ ra giải pháp chấp nhận được và thực hiện nó, thư viện bên thứ ba vẫn sẽ gặp vấn đề tương tự. "


-1

Python thiếu jit / aot và khung thời gian nó được viết tại các bộ xử lý đa luồng không tồn tại. Ngoài ra, bạn có thể biên dịch lại mọi thứ trong Julia lang thiếu GIL và tăng tốc độ cho mã Python của bạn. Ngoài ra loại Jython hút nó chậm hơn Cpython và Java. Nếu bạn muốn sử dụng Python, hãy cân nhắc sử dụng các plugin song song, bạn sẽ không tăng tốc độ tức thì nhưng bạn có thể lập trình song song với plugin phù hợp.


PyPy thì sao?
denis631
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.