【发布时间】:2010-09-14 19:57:50
【问题描述】:
我有一个只能通过静态方法从外部访问的类。然后这些静态方法创建类的对象以在方法中使用,然后它们返回并且对象可能被销毁。该类是几个配置文件的 getter/setter,现在我需要在对配置文件的访问上放置线程锁。
由于我有几个不同的静态方法都需要对所有在方法范围内创建对象的配置文件进行读/写访问,我正在考虑在对象构造函数内部完成锁定获取,然后释放在析构函数中。
我的同事表示担心,如果发生某些事情,这似乎可能会使班级永远锁定。他还提到了关于垃圾收集器如何调用 python 中的析构函数,但我们都对 python 比较陌生,所以这是一个未知数。
这是一个合理的解决方案,还是我应该在每个方法本身中锁定/解锁?
Class A():
rateLock = threading.RLock()
chargeLock = threading.RLock()
@staticmethod
def doZStuff():
a = A()
a.doStuff('Z')
@staticmethod
def doYStuff():
a = A()
a.doStuff('Y')
@synchronized(lock)
def doStuff(self, type):
if type == 'Z':
otherstuff()
elif type == 'B':
evenmorestuff()
是否有可能让它与doStuff() 上的装饰器而不是doZStuff() 上的装饰器一起工作
更新
感谢大家的回答。我面临的问题主要是因为异步访问我的模块并没有什么意义,但这只是 API 的一部分。通过 API 访问我们的东西的团队抱怨并发问题。所以我不需要完美的解决方案,我只是努力做到这一点,这样他们就不会崩溃我们的一方或取回垃圾数据
【问题讨论】:
-
请注意,将这些静态函数放在模块范围内会更简洁,然后将类定义视为完全私有的,即模块的实现细节。
标签: python multithreading locking