2013-05-28 6 views
8

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?

+0

Bad ý tưởng để sử dụng nó kể từ khi vấn đề thừa kế. – Chameleon

+0

Bạn có thể xây dựng? –

+0

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

Trả lời

2

Chắc chắn. Bạn muốn có một tham chiếu đến khóa đó là dễ dàng để có được tại, và lưu trữ nó trên lớp học là tốt.

Bạn có thể muốn gọi nó là __lock (để kích hoạt name mangling) mặc dù, vì vậy nó không nhầm lẫn với ổ khóa ở lớp con của A