通过DBUtils.PooledDB编写一个类,包含创建地址池和执行sql两个功能,如果保证其他程序import调用这个类的时候不会重复创建地址池??? 单例模式好像没有用
通过DBUtils.PooledDB编写一个类,包含创建地址池和执行sql两个功能,如果保证其他程序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
来实现。
2 回答4.3k 阅读✓ 已解决
2 回答867 阅读✓ 已解决
1 回答4.1k 阅读✓ 已解决
3 回答868 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
4 回答2.6k 阅读
3 回答912 阅读✓ 已解决
在python的import机制里,一个模块只会被导入一次,除了手动进行reload操作,因此你问题中的重复创建地址池,应该是由其他原因产生的,不是因为模块被多个文件import导致的。