2009-10-18 27 views
8

Tôi thường thấy mọi người nói rằng GIL là thông dịch viên Python (ngay cả ở đây trên stackoverflow).Có phải Python GIL thực sự là thông dịch viên không?

Nhưng những gì tôi nhìn thấy trong mã nguồn có vẻ như GIL là một biến toàn cầu và do đó có một GIL cho tất cả các thông dịch viên trong mỗi quá trình python. Tôi biết họ đã làm điều này vì không có đối tượng thông dịch nào được truyền đi như lua hay TCL, nó không được thiết kế tốt ngay từ đầu. Và luồng lưu trữ cục bộ dường như không thể di chuyển được cho những người dùng python.

Điều này có đúng không? Tôi đã có một cái nhìn ngắn ở phiên bản 2.4 tôi đang sử dụng trong một dự án ở đây.

Điều này có thay đổi trong các phiên bản sau, đặc biệt là trong 3.0 không?

Trả lời

7

GIL thực sự là một quá trình, không phải cho mỗi phiên dịch. Điều này không thay đổi trong 3.x.

0

Tôi tin rằng điều này là đúng (ít nhất là bằng Python 2.6) mà mỗi quá trình có thể có nhiều nhất một trình thông dịch CPython được nhúng (các thời gian chạy khác có thể có các ràng buộc khác nhau). Tôi không chắc liệu đây có phải là vấn đề với GIL hay không, nhưng có khả năng là do tình trạng toàn cầu, hoặc để bảo vệ khỏi tình trạng xung đột toàn cầu trong các mô-đun C của bên thứ ba. Từ số CPython API Docs:

[Py ___ Initialize()] là lần không được gọi khi lần thứ hai (không gọi Py_Finalize() trước). Không có giá trị quay lại; nó là một lỗi nghiêm trọng nếu khởi tạo thất bại.

Bạn có thể quan tâm đến dự án Unladen Swallow, nhằm cuối cùng loại bỏ GIL hoàn toàn khỏi CPython. Các thời gian chạy Python khác không có GIL, như (tôi tin) Stackless Python và chắc chắn là Jython.

Cũng lưu ý rằng GIL là still present in CPython 3.x.

+1

Rất nhiều dự án đã xóa GIL khỏi CPython trước đây. Unladen Swallow không phải là người đầu tiên. Tuy nhiên họ không thực hiện tốt như phiên bản GIL nên không ai sử dụng chúng. – nosklo

+1

Ngoài ra, ngăn xếp không loại bỏ GIL. Trong thực tế, bất kỳ hoạt động chặn nào trong bất kỳ microthread stackless nào cũng sẽ chặn toàn bộ ứng dụng. – nosklo

+0

Và Jython quá chậm nên cũng không thể sử dụng được - trừ khi bạn chỉ sử dụng nó cho một plugin kịch bản cho một chương trình java, nơi hầu hết công việc được thực hiện bằng Python. – Lothar

2

Có lẽ sự nhầm lẫn xảy ra vì hầu hết mọi người cho rằng Python có một trình thông dịch cho mỗi quá trình. Tôi nhớ lại đọc rằng hỗ trợ cho nhiều thông dịch viên thông qua C API phần lớn chưa được kiểm tra và hầu như không bao giờ được sử dụng. (Và khi tôi đã cho nó đi, không hoạt động đúng.)

Các vấn đề liên quan