当前位置: 首页 > 知识库问答 >
问题:

python - 单例 单例,多线程才是单例,在多进程单例无效,大家帮解释?

颛孙昆
2024-04-11

单例 单例,多线程才是单例,在多进程单例无效,大家帮解释?

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()

共有1个答案

袁晟
2024-04-11

首先加两行代码在你的原有代码中:

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?我试着用多种方案说服他。但是,他没有。 后来,我在家里尝试了下面的代码,在那里我使用了带有多个线程的简单的单例类。 那么,问题是,在多线程环境中是否有必要使用或/和双重检查方法?似乎我的第一个代码本身(没有添加任何额外的

  • 我在多线程环境中做的工作很少。所以,我需要知道below类的getInstance函数是否是线程安全的。这是单例类: 在getInstance函数(未注释)中,返回静态对象的引用。它需要线程安全机制吗? 在第二个getInstance(注释)中,如果singleObject为null,我们就创建对象。所以,它需要锁定机制,需要同步,对吧?

  • 本文向大家介绍java 多线程死锁详解及简单实例,包括了java 多线程死锁详解及简单实例的使用技巧和注意事项,需要的朋友参考一下 java 多线程死锁   相信有过多线程编程经验的朋友,都吃过死锁的苦。除非你不使用多线程,否则死锁的可能性会一直存在。为什么会出现死锁呢?我想原因主要有下面几个方面:     (1)个人使用锁的经验差异     (2)模块使用锁的差异     (3)版本之间的差异