你好!提示,请注意我对单例的实现。我按照pep-0318的建议实现它:总的来说,代码如下所示:
def singleton(cls):
instance = {}
def get_instance():
if cls not in instance:
instance[cls] = cls()
return instance[cls]
return get_instance()
@singleton
class MyClass:
******
我不知道为什么我的代码有效。我实验了10个线程,调用这个类的同一个方法,这个方法耗时很长(4-5秒的实时),但是锁不能被调用。这个实现线程安全吗?如果是,为什么?
CPython(标准 Python 解释器)使用GIL。因此,Python 中的线程不能并行工作(I/O 线程除外),而是依次(协作)工作。
当一个线程启动时,GIL 会阻塞所有其他线程。
了解有关 GIL wiki的更多信息,habr
添加:
单音本身的实现(方法中没有额外的锁)不是线程安全的。注意:
使用标准范围时,程序可能会产生不同的结果,因为 有时会在操作内部发生中断
+=
但是如果由于某种原因,在单例方法内部,中断发生的频率超过了 GIL 的要求,那么结果将是稳定和正确的。(如果未注释
data = mrange
)。如果我正确理解了这个问题