Küresel değişkenler içinde bir kilit tanımlamak istemediğimden ve ayrıca kilitlenmeyi önlemek istediğimden, bir sınıf değişkeni thread lock olarak kullanmayı düşünüyordum. Bu gerçekten çalışıyor mu? Örnek:Python: Sınıf değişkenlerini iplik kilitleri olarak kullanabilir miyim?
import threading
class A(object):
lock = threading.Lock()
a = 1
@classmethod
def increase_a(cls):
with cls.lock:
cls.a += 1
ben sınıfın içinde veya dışında bir yerde A.lock
değişkeni yeniden atama olmaz göz önüne alındığında, benim varsayım küresel bir kilit aynı şekilde ele alınır olurdu? Bu doğru mu?
Kötü düşüncenin alt sınıflarda kilitleri ile karıştırılmamalıdır değil. – Chameleon
Ayrıntılı bilgi verir misiniz? –
Evet, ayrıntılı bir şekilde çalışacağım: A.lock A metaclass (varsayılan tür olarak) tarafından başlatılır - A'dan alınan tüm sınıflar aynı kilidi paylaşır, böylece sınıf B (A): pass 'olur A.lock == B lock '' '' '' '' '' '' '' '' yi kullanacaksa, çifte yana kilitlenecektir A. A.lock.aquire(); B.lock.aquire() # deadlock A.lock, B.lock'tur. Geçerli model, sınıf başlatma kilidi ile metaclass (defualt tipi) değiştirilir, bu, thread güvenli mirasına izin verir. Bu durumda RLock kullanmayı denemeyin çünkü daha karmaşık hatalara yol açacaktır. – Chameleon