单例 单例,多线程才是单例,在多进程单例无效,大家帮解释?
import multiprocessingimport threadingimport timedef singleton(cls): _instance = {} def inner(): if cls not in _instance: _instance[cls] = cls() return _instance[cls] return inner@singletonclass Cls(object): count = 0 def __init__(self): self.count += 1def 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()
首先加两行代码在你的原有代码中:
import multiprocessingimport threadingimport timedef singleton(cls): _instance = {} def inner(): if cls not in _instance: _instance[cls] = cls() return _instance[cls] return inner@singletonclass Cls(object): count = 0 def __init__(self): self.count += 1def 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进程默认你是无法访问的,他们彼此之间互相独立,内存地址也不同。
而多线程不同,多线程都在同一个进程下,所以内存空间共享,单例在线程间是有效的。
本文向大家介绍python 简单搭建阻塞式单进程,多进程,多线程服务的实例,包括了python 简单搭建阻塞式单进程,多进程,多线程服务的实例的使用技巧和注意事项,需要的朋友参考一下 我们可以通过这样子的方式去理解apache的工作原理 1 单进程TCP服务(堵塞式) 这是最原始的服务,也就是说只能处理个客户端的连接,等当前客户端关闭后,才能处理下个客户端,是属于阻塞式等待 这种阻塞型自然不适合处
问题内容: 在多线程环境中使用Singleton类的首选方法是什么? 假设我有3个线程,并且所有这些线程都尝试同时访问单例类的方法- 如果不保持同步会怎样? 在内部使用 方法还是使用块是好的做法。 请告知是否还有其他出路。 问题答案: 从理论上讲,这项任务并不容易,因为您要使其真正成为线程安全的。 在此上找到了一篇非常不错的论文@ IBM 仅获取单例不需要任何同步,因为这只是读取。因此,只需同步S
本文向大家介绍Python中单线程、多线程和多进程的效率对比实验实例,包括了Python中单线程、多线程和多进程的效率对比实验实例的使用技巧和注意事项,需要的朋友参考一下 python的多进程性能要明显优于多线程,因为cpython的GIL对性能做了约束。 Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多进程(Thread)的情况下,不能发挥多核的优
本文向大家介绍Java多线程实战之单例模式与多线程的实例详解,包括了Java多线程实战之单例模式与多线程的实例详解的使用技巧和注意事项,需要的朋友参考一下 1、立即加载/饿汉模式 立即加载/饿汉模式是在类创建的同时已经创建好一个静态的对象供系统使用,不存在线程安全问题 2、延迟加载/懒汉模式 延迟加载/懒汉模式是在调用方法时实例才被创建,在多线程环境下,会出现取出多个实例的情况,与单例模式的初衷是
本文向大家介绍浅谈C#多线程简单例子讲解,包括了浅谈C#多线程简单例子讲解的使用技巧和注意事项,需要的朋友参考一下 .NET将关于多线程的功能定义在System.Threading名字空间中。因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;)。 a.启动线程 顾名思义,“启动线程”就是新建并启动一个线程的意思,如下代码可实现: 其中的 Count 是将要
现在,他提出的下一个问题是为多线程环境编写单例类。然后,我写了双重检查单例类。 然后,他反对使用和双重检查,并说这是没用的。为什么要检查两次,为什么要使用synchronized?我试着用多种方案说服他。但是,他没有。 后来,我在家里尝试了下面的代码,在那里我使用了带有多个线程的简单的单例类。 那么,问题是,在多线程环境中是否有必要使用或/和双重检查方法?似乎我的第一个代码本身(没有添加任何额外的