Python的paster serve app.ini
花费的时间超过了我想为第一个请求做好准备的时间。
我知道如何使用中间件来分析请求,但是如何分析初始化时间?我希望它不会分叉一个线程池并在它准备好服务后立即退出,因此它准备就绪后的时间不会显示在配置文件中。
答案 0 :(得分:1)
通常,您的方法可能是围绕代码段执行时序块,然后发出日志记录语句。对于init之后的关闭,我不熟悉你正在使用的具体内容。
编辑:我使用这个中间件来帮助我找到性能下沉孔。它目前是一个werkzeug中间件,您可以根据自己的使用情况进行调整。希望它有所帮助
import re
re_profile = re.compile(ur'(^|&|\?)prof($|=|&)')
class ProfilerMiddleware(BaseProcessor):
def process_runner(self, runner, environ):
self.profiler = None
if (environ['REMOTE_ADDR'] in settings_static.internal_ips or settings_static.local_server) and re_profile.match(environ['QUERY_STRING']):
self.profiler = cProfile.Profile()
def wrap(*args, **kwargs):
return self.profiler.runcall(runner, *args, **kwargs)
return wrap
def process_response(self, request, response):
if self.profiler:
self.profiler.create_stats()
out = StringIO.StringIO()
old_stdout, sys.stdout = sys.stdout, out
#from dozer.profile import buildtree, write_dot_graph
#write_dot_graph(self.profiler.getstats(), buildtree(self.profiler.getstats()), "/tmp/output.gv")
self.profiler.print_stats(1)
sys.stdout = old_stdout
response.response = [u'<pre>%s</pre>' % to_unicode(out.getvalue())]
response.content_type = 'text/html'
答案 1 :(得分:1)
即使您对其进行了分析 - 我怀疑您会得到很多优化提示。
我们在mod_wsgi设置中使用Paster,并减少启动时间,以便用户不会受到影响,并确保例如toscawidgets设置正确,我们这样做:
app = paste.fixture.TestApp(application)
# TODO-dir: FIXME, must go away!
try:
app.get("/")
except:
pass
这里的应用程序当然是初始化/加载的贴纸应用程序。
答案 2 :(得分:1)
我几乎总是在开发过程中使用paster serve --reload ...
。该命令作为子进程执行(它使用subprocess
模块执行自己的脚本,而不是fork()
)。
子进程轮询源代码更改,在检测到更改时退出,并由父paster serve --reload
重新启动。
这就是说如果你要描述paster serve
本身,省略--reload
参数。使用中间件分析各个请求应该可以正常工作。
我的特殊问题是,pkg_resources
在首次调用时会占用与所有已安装软件包成比例的时间。我通过重建我的virtualenv解决了它,没有不必要的包。