Python攻克之路-单例模式
单例模式
实例化
[root@node2 class2]# cat dan.py
#!/usr/local/python3/bin/python3
class Foo:
def __init__(self,name, age):
self.name = name
self.age = age
obj = Foo() #obj对象,obj也成为Foo类的实例,这个过程也叫实例化
单例模式的实现:永远只使用一份实例(对象)
[root@node2 class2]# cat dan.py
#!/usr/local/python3/bin/python3
class Foo:
def __init__(self,name, age):
self.name = name
self.age = age
def show(self):
print(self.name,self.age)
v = None
while True:
if v: #第一次v是None,走else,v=Foo()创建了一个对象,第二次循环时,v已经有值
v.show() #执行show时,永远只使用同一个对象
else:
v = Foo('reid',23)
v.show()
优化:以上方法依赖于一个全局变量
[root@node2 class2]# cat dan.py
#!/usr/local/python3/bin/python3
class Foo:
__v = None
@classmethod
def get_isinstance(cls): #cls代指Foo类
if cls.__v:
return cls.__v
else:
cls.__v = Foo() #给cls.__v赋值一个Foo对象
return cls.__v
obj = Foo.get_isinstance()
# 如果使用单例模式,就不要使用类加括号,第一次执行时使用执行get_isinstance方法,__v是None,
这时执行else,cls.__v = Foo()创建一个对象,这个对象再赋值给__v,再return cls.__v的值,此
时obj就是刚创建的对象,当obj = Foo.get_isinstance()执行完后,__v是第一次执行时创建的对
象
[root@node2 class2]# cat dan.py
#!/usr/local/python3/bin/python3
class Foo:
__v = None
@classmethod
def get_isinstance(cls):
if cls.__v:
return cls.__v
else:
cls.__v = Foo()
return cls.__v
obj1 = Foo.get_isinstance()
print(obj1)
obj2 = Foo.get_isinstance()
print(obj2)
obj3 = Foo.get_isinstance()
print(obj3)
[root@node2 class2]# python3 dan.py
<__main__.Foo object at 0x7fe8c01ce4a8> #三个实例都是一样的,实现使用同一对象
<__main__.Foo object at 0x7fe8c01ce4a8>
<__main__.Foo object at 0x7fe8c01ce4a8>
优点:
a. 在内存中的对象只需要创建一份
database场景使用
描述:连接数据库,对数据库做操作,实际上连接时的操作是很耗时间的,假设连接上数据库后,需要做的操作是10秒,可能连接的过程就要花费8秒的时间,执行的过程只需要2秒
一般,有一个数据库的连接池,机器启动后,程序就主动去连接,假设默认创建5个链接,相当于还没发出连接请求,这5个通道就已经创建了,这样,每次操作都使用线程的通道就可以了,拿一个执行一个,如果并发数达到5后,就表明5个连接数都用完了,再有新的请求就处于等待,之前的5个,那个先执行完,就把它放回连接池中,新的请求再使用它
程序运行起来,第一个用户请求来,应该利用原来的5个连接池,无论多少个用户请求来,数据库的连接池中的数量都是固定的,不会增加
如果连接池是一个类,每次来请求,都是执行这个类的一个方法,通过这个类创建对象的方法,无论多少个人来都是使用同一个对象,对象都是同一个,对象又叫实例,所以在程序中,可以把这个类写成是单例模式,每次请求都使用同一实例做操作
tornado使用
安装tornado模块
[root@node2 class2]# pip3 install tornado --trusted-host pypi.douban.com
import _ssl # if we can't import it, let the error propagate
ModuleNotFoundError: No module named '_ssl' ##ssl问题
[root@node2 class2]# yum install openssl openssl-devel
重新编译python3
[root@node2 ~]# cd Python-3.6.5 [root@node2 Python-3.6.5]# ./configure --prefix=/usr/local/python3 [root@node2 Python-3.6.5]# make [root@node2 Python-3.6.5]# make install
重新安装
[root@node2 class2]# pip3 install tornado --trusted-host pypi.douban.com
Collecting tornado
Downloading http://pypi.doubanio.com/packages/cf/d1/3be271ae5eba9fb59df63c9891fdc7d8044b999e8ac145994cdbfd2ae66a/tornado-5.0.2.tar.gz (506kB)
100% |████████████████████████████████| 512kB 2.1MB/s
Installing collected packages: tornado
Running setup.py install for tornado ... done
Successfully installed tornado-5.0.2
web程序
[root@node2 class2]# cat web.py
#!/usr/local/python3/bin/python3
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
import time
self.write(str(time.time()))
application = tornado.web.Application([
(r"/index", MainHandler),
])
if __name__ == "__main__":
application.listen(9999) ##使用单例模式,运行起来就监听9999端口
tornado.ioloop.IOLoop.instance().start() #ioloop是一个类,start就永远运行
[root@node2 class2]# python3 web.py


浙公网安备 33010602011771号