Hỗ trợ lưu trữ cục bộ theo chủ đề¶
Trình thông dịch Python cung cấp hỗ trợ cấp thấp cho bộ lưu trữ cục bộ theo luồng (TLS), gói này bao bọc việc triển khai TLS gốc cơ bản để hỗ trợ bộ lưu trữ cục bộ theo luồng ở cấp độ Python API (threading.local). API cấp CPython C tương tự như API được cung cấp bởi pthreads và Windows: sử dụng khóa luồng và các hàm để liên kết giá trị void* cho mỗi luồng.
Một thread state thì not cần phải là attached khi gọi các hàm này; họ cung cấp khóa riêng của họ.
Lưu ý rằng Python.h không bao gồm việc khai báo API TLS, bạn cần bao gồm pythread.h để sử dụng bộ nhớ cục bộ theo luồng.
Ghi chú
Không có hàm API nào xử lý việc quản lý bộ nhớ thay mặt cho các giá trị void*. Bạn cần phải tự mình phân bổ và giải quyết chúng. Nếu các giá trị void* là PyObject* thì các hàm này cũng không thực hiện các thao tác đếm lại trên chúng.
Lưu trữ theo chủ đề cụ thể API¶
Bộ lưu trữ dành riêng cho luồng (TSS) API được giới thiệu để thay thế việc sử dụng TLS API hiện có trong trình thông dịch CPython. Zz006zz này sử dụng loại Py_tss_t mới thay vì int để biểu thị các khóa của luồng.
Added in version 3.7.
Xem thêm
"C-API mới cho bộ nhớ cục bộ theo luồng trong CPython" (PEP 539)
-
type Py_tss_t¶
Cấu trúc dữ liệu này biểu thị trạng thái của khóa luồng, định nghĩa của nó có thể phụ thuộc vào việc triển khai TLS cơ bản và nó có trường bên trong biểu thị trạng thái khởi tạo của khóa. Không có thành viên công cộng trong cấu trúc này.
Khi Py_LIMITED_API không được xác định, việc phân bổ tĩnh loại này theo
Py_tss_NEEDS_INITđược cho phép.
-
Py_tss_NEEDS_INIT¶
Macro này mở rộng tới bộ khởi tạo cho các biến
Py_tss_t. Lưu ý rằng macro này sẽ không được xác định bằng Py_LIMITED_API.
Phân bổ động¶
Phân bổ động của Py_tss_t, được yêu cầu trong các mô-đun mở rộng được xây dựng bằng Py_LIMITED_API, trong đó không thể thực hiện phân bổ tĩnh loại này do việc triển khai nó không rõ ràng tại thời điểm xây dựng.
-
Py_tss_t *PyThread_tss_alloc()¶
- Một phần của ABI ổn định kể từ phiên bản 3.7.
Trả về một giá trị có cùng trạng thái với giá trị được khởi tạo bằng
Py_tss_NEEDS_INIThoặcNULLtrong trường hợp phân bổ động không thành công.
-
void PyThread_tss_free(Py_tss_t *key)¶
- Một phần của ABI ổn định kể từ phiên bản 3.7.
Giải phóng key đã cho do
PyThread_tss_alloc()phân bổ, sau lần gọiPyThread_tss_delete()đầu tiên để đảm bảo mọi luồng cục bộ liên quan đã được bỏ chỉ định. Đây là điều không thể thực hiện được nếu đối số key làNULL.Ghi chú
Một phím được giải phóng sẽ trở thành một con trỏ lơ lửng. Bạn nên reset key về
NULL.
phương pháp¶
Tham số key của các hàm này không được là NULL. Hơn nữa, các hành vi của PyThread_tss_set() và PyThread_tss_get() không được xác định nếu Py_tss_t đã cho chưa được PyThread_tss_create() khởi tạo.
-
int PyThread_tss_is_created(Py_tss_t *key)¶
- Một phần của ABI ổn định kể từ phiên bản 3.7.
Trả về giá trị khác 0 nếu
Py_tss_tđã cho được khởi tạo bởiPyThread_tss_create().
-
int PyThread_tss_create(Py_tss_t *key)¶
- Một phần của ABI ổn định kể từ phiên bản 3.7.
Trả về giá trị 0 khi khởi tạo thành công khóa TSS. Hành vi này không được xác định nếu giá trị được chỉ ra bởi đối số key không được khởi tạo bởi
Py_tss_NEEDS_INIT. Hàm này có thể được gọi nhiều lần trên cùng một khóa -- việc gọi nó trên một khóa đã được khởi tạo là điều không nên và ngay lập tức trả về thành công.
-
void PyThread_tss_delete(Py_tss_t *key)¶
- Một phần của ABI ổn định kể từ phiên bản 3.7.
Phá hủy khóa TSS để quên các giá trị được liên kết với khóa trên tất cả các luồng và thay đổi trạng thái khởi tạo của khóa thành chưa được khởi tạo. Một khóa bị phá hủy có thể được khởi tạo lại bởi
PyThread_tss_create(). Hàm này có thể được gọi nhiều lần trên cùng một khóa -- việc gọi nó trên một khóa đã bị hủy là điều không nên.
-
int PyThread_tss_set(Py_tss_t *key, void *value)¶
- Một phần của ABI ổn định kể từ phiên bản 3.7.
Trả về giá trị 0 để biểu thị việc liên kết thành công giá trị void* với khóa TSS trong luồng hiện tại. Mỗi luồng có một ánh xạ riêng biệt của khóa tới giá trị void*.
-
void *PyThread_tss_get(Py_tss_t *key)¶
- Một phần của ABI ổn định kể từ phiên bản 3.7.
Trả về giá trị void* được liên kết với khóa TSS trong luồng hiện tại. Điều này trả về
NULLnếu không có giá trị nào được liên kết với khóa trong luồng hiện tại.
API kế thừa¶
Sắp loại bỏ từ phiên bản 3.7: Zz001zz này được thay thế bởi thread-specific storage (TSS) API.
Ghi chú
Phiên bản API này không hỗ trợ các nền tảng trong đó khóa TLS gốc được xác định theo cách không thể truyền tới int một cách an toàn. Trên các nền tảng như vậy, PyThread_create_key() sẽ ngay lập tức quay trở lại với trạng thái lỗi và các chức năng TLS khác sẽ không hoạt động trên các nền tảng đó.
Do vấn đề tương thích đã nêu ở trên, phiên bản API này không nên được sử dụng trong mã mới.
-
int PyThread_create_key()¶
- Một phần của ABI ổn định.
-
void PyThread_delete_key(int key)¶
- Một phần của ABI ổn định.
-
int PyThread_set_key_value(int key, void *value)¶
- Một phần của ABI ổn định.
-
void *PyThread_get_key_value(int key)¶
- Một phần của ABI ổn định.
-
void PyThread_delete_key_value(int key)¶
- Một phần của ABI ổn định.
-
void PyThread_ReInitTLS()¶
- Một phần của ABI ổn định.