我有一个对象,它加载了来自DB Object_X
的所有数据。防止在每个请求上创建昂贵的对象
该对象有几个定义的方法。我传递一些参数并根据参数I调用Object_X
中的函数之一,它使用对象和参数中的预填充数据来获得一些结果。
我创建了一个Web服务,它调用Object_X
中定义的任何方法并返回结果。
我的问题是,对于每次请求我一次又一次地从db加载所有的数据,这是很费时间的。有没有一种方法可以在启动服务器时加载一次数据,并为每个后续请求使用相同的对象?
我有一个对象,它加载了来自DB Object_X
的所有数据。防止在每个请求上创建昂贵的对象
该对象有几个定义的方法。我传递一些参数并根据参数I调用Object_X
中的函数之一,它使用对象和参数中的预填充数据来获得一些结果。
我创建了一个Web服务,它调用Object_X
中定义的任何方法并返回结果。
我的问题是,对于每次请求我一次又一次地从db加载所有的数据,这是很费时间的。有没有一种方法可以在启动服务器时加载一次数据,并为每个后续请求使用相同的对象?
我想你正在使用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/
你会看到
的数量不断增加,每次你访问它。这意味着服务器记住状态,也意味着inc_num只能启动一次。
假设您的应用程序由长时间运行的进程提供服务(与普通CGI相反),并且您的数据库永远不会更新,您始终可以选择在模块的顶层实例化Object_X
(使其成为全球),所以它只会在每个进程中创建一次。现在这意味着你在进程启动时会有一些开销,并且每次更新数据库时都必须重新启动所有进程。
真正的问题恕我直言,你为什么要从一开始就加载所有的数据库?如果这是“优化”,那么可能会有更好的工具和策略(更快的数据库,缓存等)。
很有意思.. +1。 – aIKid