Có một số triển khai Python, ví dụ, CPython, IronPython, RPython, v.v.
Một số người trong số họ có GIL, một số thì không. Ví dụ: CPython có GIL:
Từ http://en.wikipedia.org/wiki/Global_Interpreter_Lock
Các ứng dụng được viết bằng ngôn ngữ lập trình với GIL có thể được thiết kế để sử dụng các quy trình riêng biệt để đạt được sự song song hoàn toàn, vì mỗi quy trình có trình thông dịch riêng và đến lượt nó có GIL riêng.
Lợi ích của GIL
- Tăng tốc độ của các chương trình đơn luồng.
- Dễ dàng tích hợp các thư viện C thường không an toàn cho chuỗi.
Tại sao Python (CPython và những người khác) sử dụng GIL
Trong CPython, khóa trình thông dịch toàn cầu, hoặc GIL, là một mutex ngăn chặn nhiều luồng gốc thực thi mã byte Python cùng một lúc. Khóa này là cần thiết chủ yếu vì quản lý bộ nhớ của CPython không an toàn cho chuỗi.
GIL gây tranh cãi vì nó ngăn các chương trình CPython đa luồng tận dụng tối đa các hệ thống đa bộ xử lý trong các tình huống nhất định. Lưu ý rằng các hoạt động có khả năng chặn hoặc hoạt động lâu dài, chẳng hạn như I / O, xử lý hình ảnh và xử lý số NumPy, xảy ra bên ngoài GIL. Do đó, chỉ trong các chương trình đa luồng dành nhiều thời gian bên trong GIL, diễn giải mã byte CPython, GIL mới trở thành nút cổ chai.
Python có GIL trái ngược với khóa hạt mịn vì nhiều lý do:
Nó là nhanh hơn trong trường hợp đơn luồng.
Nó nhanh hơn trong trường hợp đa luồng cho các chương trình ràng buộc i / o.
Nó nhanh hơn trong trường hợp đa luồng cho các chương trình giới hạn cpu thực hiện công việc chuyên sâu tính toán của chúng trong các thư viện C.
Nó làm cho các phần mở rộng C dễ viết hơn: sẽ không có chuyển đổi các luồng Python trừ khi bạn cho phép nó xảy ra (tức là giữa các macro Py_BEGIN_ALLOW_THREADS và Py_END_ALLOW_THREADS).
Nó làm cho thư viện C dễ dàng hơn. Bạn không phải lo lắng về an toàn luồng. Nếu thư viện không an toàn cho luồng, bạn chỉ cần giữ GIL bị khóa trong khi bạn gọi nó.
GIL có thể được phát hành bởi các phần mở rộng C. Thư viện chuẩn của Python phát hành GIL xung quanh mỗi cuộc gọi i / o chặn. Do đó, GIL không có hậu quả đối với hiệu suất của các máy chủ bị ràng buộc i / o. Do đó, bạn có thể tạo các máy chủ mạng trong Python bằng cách sử dụng các quy trình (ngã ba), luồng hoặc i / o không đồng bộ và GIL sẽ không cản trở bạn.
Các thư viện số trong C hoặc Fortran có thể được gọi tương tự với GIL được phát hành. Trong khi tiện ích mở rộng C của bạn đang chờ FFT hoàn thành, trình thông dịch sẽ thực thi các luồng Python khác. Do đó, GIL cũng dễ dàng và nhanh hơn khóa hạt mịn trong trường hợp này. Điều này tạo thành phần lớn của công việc số. Tiện ích mở rộng NumPy phát hành GIL bất cứ khi nào có thể.
Chủ đề thường là một cách xấu để viết hầu hết các chương trình máy chủ. Nếu tải thấp, việc rèn sẽ dễ dàng hơn. Nếu tải cao, i / o không đồng bộ và lập trình hướng sự kiện (ví dụ: sử dụng khung Twisted của Python) sẽ tốt hơn. Lý do duy nhất để sử dụng các luồng là thiếu os.fork trên Windows.
GIL là một vấn đề nếu và chỉ khi bạn đang thực hiện công việc đòi hỏi nhiều CPU trong Python thuần túy. Tại đây bạn có thể có được thiết kế sạch hơn bằng cách sử dụng các quy trình và truyền tin nhắn (ví dụ: mpi4py). Ngoài ra còn có một mô-đun 'xử lý' trong cửa hàng phô mai Python, cung cấp cho các quy trình giao diện giống như các luồng (tức là thay thế luồng. Đọc bằng xử lý.Process).
Các luồng có thể được sử dụng để duy trì khả năng phản hồi của GUI bất kể GIL. Nếu GIL làm suy yếu hiệu suất của bạn (xem phần thảo luận ở trên), bạn có thể để chủ đề của mình sinh ra một quy trình và chờ đợi nó kết thúc.