python 单例模式

通过DBUtils.PooledDB编写一个类,包含创建地址池和执行sql两个功能,如果保证其他程序import调用这个类的时候不会重复创建地址池??? 单例模式好像没有用

阅读 4.3k
4 个回答

在python的import机制里,一个模块只会被导入一次,除了手动进行reload操作,因此你问题中的重复创建地址池,应该是由其他原因产生的,不是因为模块被多个文件import导致的。

上代码:

地址池创建

class Mysql(object):
    __instance = None

    def __new__(cls, *args, **kwargs):
        if cls.__instance is None:
            cls.__instance = super(Mysql, cls).__new__(cls, *args, **kwargs)
        return cls.__instance

    def __init__(self):
        self.mysql = PooledDB(creator=pymysql, mincached=10, maxcached=20,
                              host='127.0.0.1', port=3306, user='chinamap', passwd='p-0p-0p-0',
                              db='operation', charset="utf8")

    def getAll(self, sql):
        print(id(self.mysql))
        _conn = self.mysql.connection()
        _cursor = _conn.cursor()
        _cursor.execute(sql)
        result = _cursor.fetchall()
        _cursor.close()
        _conn.close()
        return result

另外两个 引用的代码

from tt4 import Mysql
import time
mysql = Mysql()
print(id(mysql))
ssql= "select * from tz_ioip"
while True:
    result = mysql.getAll(ssql)
    print(result)
    time.sleep(5)

图片描述
图片描述

你说的是其他程序,,两个不同程序进程都不一样,你两个调用他就不是单例。
按照你的代码看你就是一个py文件写的Mysql类,想导入并实例化一个单例,我没细看你的代码,其实你可以在Mysql文件下面 mysql = Mysql()然后其他文件import mysql,模块就是单例

仔细看了下问题。
题主想在两个进程之间共享一个对象。
要知道,不同的进程是各自有专用的虚拟地址空间,互不干扰的。
所以要共享一个对象,需要多进程模块multiprocessing来实现。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题