【问题标题】:Prevent creating of expensive object on each request防止在每个请求上创建昂贵的对象
【发布时间】:2014-01-07 12:33:54
【问题描述】:
我有一个从 DB Object_X 加载所有数据的对象。
这个对象定义了一些方法。我传递了一些参数并基于参数调用Object_X 中的一个函数,它使用对象和参数中的预填充数据来获得一些结果。
我创建了一个 Web 服务,它调用 Object_X 中定义的任何方法并返回结果。
我的问题是,对于每个请求,我都会一次又一次地从 db 加载所有数据,这很耗时。有没有一种方法可以让我在启动服务器时加载数据并为每个后续请求使用相同的对象?
【问题讨论】:
标签:
python
python-2.7
web.py
【解决方案1】:
我想你正在使用 web.py 框架。它将基于您如何使用 web.py。对于最简单的方法,使用附带的 CherryPy WSGI 服务器,你可以试试这个:
import web
urls = (
'/', 'index'
)
def inc_num():
cnt = 0
while True:
cnt += 1
yield cnt
class index:
num = inc_num()
def GET(self):
return "Hello, world! %s" % self.num.next()
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
每次访问时
http://localhost:8080/
你会看到
Hello, world! 1
Hello, world! 2
...
每次您访问它时,数字都会不断增加。这意味着服务器记住状态,也意味着inc_num只启动一次。
【解决方案2】:
假设您的应用程序由一个长时间运行的进程提供服务(与普通 CGI 相对),并且您的数据库永远不会更新,您始终可以选择在模块的顶层实例化您的 Object_X(使其全局),因此每个进程只会创建一次。现在这意味着您将在进程启动时产生一些开销,并且每次更新数据库时都必须重新启动所有进程。
恕我直言,真正的问题是您为什么要从一开始就加载所有数据库?如果那是为了“优化”,那么可能会有更好的工具和策略(更快的数据库、缓存等)。