防止在每个请求上创建昂贵的对象

时间:2013-12-19 04:07:18

标签: python python-2.7 web.py

我有一个加载来自DB Object_X的所有数据的对象。

此对象定义了一些方法。我传递了一些参数,并根据参数I调用Object_X中的一个函数,它使用对象和参数中预先填充的数据来获得一些结果。

我创建了一个Web服务,它调用Object_X中定义的任何方法并返回结果。

我的问题是,对于每个请求,我一次又一次地从db加载所有数据,这非常耗时。当我启动服务器并为每个后续请求使用相同的对象时,有没有一种方法可以加载数据?

2 个答案:

答案 0 :(得分:0)

我想你正在使用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只启动一次。

答案 1 :(得分:0)

假设您的应用程序由长时间运行的进程提供服务(而不是像普通CGI那样),并且您的数据库永远不会更新,您始终可以选择在模块的顶层实例化Object_X(使它成为一个全局的,所以每个进程只会创建一次。现在,这意味着您将在进程启动时遇到一些开销,并且每次更新数据库时都必须重新启动所有进程。

真正的问题恕我直言,为什么你想从一开始就加载你的所有数据库?如果那是“优化”那么可能有更好的工具和策略(更快的数据库,缓存等)。