Bài đăng này từ người tạo Python, Guido Van Rossum, đề cập đến một nỗ lực sớm để loại bỏ GIL khỏi Python:
Điều này đã được thử trước đây, với kết quả đáng thất vọng, đó là lý do tại sao tôi miễn cưỡng tự mình nỗ lực nhiều. Năm 1999, Greg Stein (với Mark Hammond?) Đã tạo ra một nhánh Python (1,5 tôi tin) đã loại bỏ GIL, thay thế nó bằng các khóa hạt mịn trên tất cả các cấu trúc dữ liệu có thể thay đổi. Ông cũng đã gửi các bản vá loại bỏ nhiều sự phụ thuộc vào các cấu trúc dữ liệu có thể thay đổi toàn cầu mà tôi đã chấp nhận. Tuy nhiên, sau khi đo điểm chuẩn, nó đã chỉ ra rằng ngay cả trên nền tảng có khóa nguyên thủy khóa nhanh nhất (Windows vào thời điểm đó), nó đã làm chậm quá trình thực thi đơn luồng gần gấp hai lần, nghĩa là trên hai CPU, bạn có thể làm việc nhiều hơn một chút được thực hiện mà không có GIL so với trên một CPU với GIL. Điều này là không đủ, và bản vá của Greg biến mất vào quên lãng. (Xem bài viết của Greg về hiệu suất.)
Tôi khó có thể tranh luận với kết quả thực tế, nhưng tôi thực sự tự hỏi tại sao điều này xảy ra. Có lẽ, lý do chính khiến việc loại bỏ GIL khỏi CPython là rất khó là do hệ thống quản lý bộ nhớ đếm tham chiếu. Một chương trình Python thông thường sẽ gọi Py_INCREF
và Py_DECREF
hàng ngàn hoặc hàng triệu lần, làm cho nó trở thành một điểm tranh chấp quan trọng nếu chúng ta quấn các khóa xung quanh nó.
Nhưng, tôi không hiểu tại sao việc thêm các nguyên thủy nguyên tử sẽ làm chậm một chương trình luồng đơn . Giả sử chúng ta vừa sửa đổi CPython để biến refcount trong mỗi đối tượng Python là nguyên thủy nguyên tử. Và sau đó chúng ta chỉ thực hiện một bước tăng nguyên tử (hướng dẫn tìm nạp và thêm) khi chúng ta cần tăng số tham chiếu. Điều này sẽ làm cho tham chiếu Python đếm luồng an toàn và không nên có bất kỳ hình phạt hiệu năng nào trên ứng dụng một luồng, bởi vì sẽ không có tranh chấp khóa.
Nhưng than ôi, nhiều người thông minh hơn tôi đã cố gắng và thất bại, vì vậy rõ ràng tôi đang thiếu một cái gì đó ở đây. Có gì sai với cách tôi nhìn vấn đề này?