Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Python Global Interpreter Lock (GIL) là gì?

Trong bài viết này, chúng ta sẽ tìm hiểu về Global Interpreter Lock (GIL) trong Python.

GIL là một khóa (mutex) ngăn cản nhiều thread thực thi bytecode Python cùng lúc. GIL được coi là một hạn chế trong Python 3.x (và các phiên bản trước) vì nó không cho phép đa luồng thực sự (true multithreading) trên kiến trúc đa lõi.

Tại sao GIL được giới thiệu?

Python sử dụng cơ chế thu gom rác tự động dựa trên đếm tham chiếu (reference counting). Khi số tham chiếu của đối tượng giảm về 0, bộ nhớ được giải phóng.

>>> import sys
>>> var = {}
>>> print(sys.getrefcount(var))
2
>>> v = var
>>> print(sys.getrefcount(v))
3

Nếu đếm tham chiếu tăng/giảm đồng thời từ nhiều thread, bộ thu gom rác có thể hoạt động không chính xác, dẫn đến rò rỉ bộ nhớ (memory leak).

Để giảm thiểu rủi ro này, GIL được giới thiệu. Một khóa toàn cục được coi là tốt hơn việc thêm khóa cho từng biến (dễ dẫn đến deadlock).

Python Global Interpreter Lock (GIL) là gì?

Tại sao GIL vẫn tồn tại?

Việc loại bỏ GIL phức tạp vì CPython (bản triển khai chính của Python) được viết bằng C và phụ thuộc sâu vào mô hình bộ nhớ hiện tại. Các phương án thay thế (như fine-grained locking) làm giảm hiệu năng đơn luồng.

Ví dụ minh họa vấn đề:

Giả sử tiến trình P1 có 2 thread: t1 và t2. Thread Python là native thread, được lên lịch bởi OS.

  • t1 chạy (acquire GIL) → t1 chờ I/O (release GIL)
  • t2 chạy (acquire GIL) → t1 sẵn sàng chạy nhưng phải chờ vì GIL bị t2 nắm

Kết quả: GIL trở thành nút thắt cổ chai (bottleneck). Nếu viết ứng dụng đa luồng với tác vụ CPU-bound nặng, Python không thể tận dụng đa lõi.

Tuy nhiên, hầu hết ứng dụng Python (web app, Django server) là I/O-bound, nên GIL không gây vấn đề lớn.

Lập trình viên Python thường không cần lo về acquire/release GIL trừ khi viết extension C/C++.

Kết luận

Trong bài viết này, chúng ta đã tìm hiểu về Python GIL, tầm quan trọng và lý do không thể loại bỏ trực tiếp.