Tôi đã suy nghĩ về việc sử dụng một biến lớp như là một khóa thread, vì tôi không muốn xác định một khóa trong các biến toàn cầu và cũng muốn ngăn chặn bế tắc. Điều này thực sự làm việc? Ví dụ:Python: Tôi có thể sử dụng biến lớp làm khóa chuỗi không?
import threading
class A(object):
lock = threading.Lock()
a = 1
@classmethod
def increase_a(cls):
with cls.lock:
cls.a += 1
Xét tôi sẽ không tái gán biến A.lock
ở đâu đó bên trong hoặc bên ngoài lớp, giả định của tôi sẽ được rằng nó được xử lý giống như một khóa toàn cầu? Điều này có đúng không?
Bad ý tưởng để sử dụng nó kể từ khi vấn đề thừa kế. – Chameleon
Bạn có thể xây dựng? –
Vâng, tôi sẽ giải thích: A.lock được khởi tạo bởi A metaclass (như kiểu mặc định) - tất cả các lớp được thừa hưởng từ A sẽ chia sẻ cùng một khóa để 'class B (A): pass' là' A.lock == B. lock' nếu 'B' sẽ sử dụng' A.increase' nó sẽ dẫn đến khóa từ double 'A.lock.aquire(); B.lock.aquire() # bế tắc A.lock là B.lock'. Mẫu hợp lệ là thay thế metaclass (kiểu defualt) với khóa khởi tạo lớp, điều này sẽ cho phép thừa kế luồng an toàn. Đừng cố gắng sử dụng trong trường hợp này RLock vì nó sẽ dẫn đến các lỗi phức tạp hơn. – Chameleon