单例 单例,多线程才是单例,在多进程单例无效,大家帮解释?-灵析社区

Frank的私人司机

单例 单例,多线程才是单例,在多进程单例无效,大家帮解释? import multiprocessing import threading import time def singleton(cls): _instance = {} def inner(): if cls not in _instance: _instance[cls] = cls() return _instance[cls] return inner @singleton class Cls(object): count = 0 def __init__(self): self.count += 1 def run1(): for i in range(0, 100): a = Cls() a.count += 1 b = Cls() b.count += 1 b = Cls() b.count += 1 time.sleep(1) print("a", a.count) def run2(): for i in range(0, 100): a = Cls() a.count += 1 b = Cls() b.count += 1 b = Cls() b.count += 1 time.sleep(1) print("b", a.count) if __name__ == '__main__': threading.Thread(target=run1).start() threading.Thread(target=run2).start() # multiprocessing.Process(target=run1).start() # multiprocessing.Process(target=run2).start()

阅读量:156

点赞量:0

问AI
首先加两行代码在你的原有代码中: import multiprocessing import threading import time def singleton(cls): _instance = {} def inner(): if cls not in _instance: _instance[cls] = cls() return _instance[cls] return inner @singleton class Cls(object): count = 0 def __init__(self): self.count += 1 def run1(): for i in range(0, 100): a = Cls() a.count += 1 b = Cls() b.count += 1 b = Cls() b.count += 1 time.sleep(1) print("a", a.count, "id:", id(b)) # 改动 def run2(): for i in range(0, 100): a = Cls() a.count += 1 b = Cls() b.count += 1 b = Cls() b.count += 1 time.sleep(1) print("b", a.count, "id:", id(b)) # 改动 if __name__ == '__main__': threading.Thread(target=run1).start() threading.Thread(target=run2).start() # multiprocessing.Process(target=run1).start() # multiprocessing.Process(target=run2).start() 你自行打印一下就能看到,多线程下的两个 "print" 下的 "id" 是一样的,多进程的则只能保证单个进程的id一致,两个进程下的这个 "id" 并不同。 造成这种差异的原因是python的多进程内存空间是不共享的,每一个进程都有一个单独的python解释器在背后运行,也就是你在A进程操作的对象,在B进程默认你是无法访问的,他们彼此之间互相独立,内存地址也不同。 而多线程不同,多线程都在同一个进程下,所以内存空间共享,单例在线程间是有效的。