单例 单例,多线程才是单例,在多进程单例无效,大家帮解释?
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()
首先加两行代码在你的原有代码中:
你自行打印一下就能看到,多线程下的两个
print
下的id
是一样的,多进程的则只能保证单个进程的id一致,两个进程下的这个id
并不同。造成这种差异的原因是python的多进程内存空间是不共享的,每一个进程都有一个单独的python解释器在背后运行,也就是你在A进程操作的对象,在B进程默认你是无法访问的,他们彼此之间互相独立,内存地址也不同。
而多线程不同,多线程都在同一个进程下,所以内存空间共享,单例在线程间是有效的。