如何分析“paster-serve”的启动时间?

2024-05-23 17:45:07 发布

您现在位置:Python中文网/ 问答频道 /正文

Python的paster serve app.ini花费的时间比第一个请求准备好的时间要长。在

我知道如何使用中间件来分析请求,但是如何分析初始化时间呢?我希望它不分叉线程池,并在它准备好服务后立即退出,这样它准备好之后的时间不会出现在配置文件中。在


Tags: 中间件app配置文件时间线程ini花费serve
3条回答

即使你想对它进行分析-我怀疑你能得到多少优化的提示。在

我们在mod廑wsgi设置中使用了Paster,为了减少启动时间,使用户不受影响,并确保正确设置了例如toscawidgets,我们这样做:

app = paste.fixture.TestApp(application)
# TODO-dir: FIXME, must go away!
try:
    app.get("/")
except:
    pass

这里的应用程序当然是初始化/加载的粘贴应用程序。在

一般来说,您的方法可以是围绕代码部分设置计时块,然后发出日志记录语句。至于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'

我几乎总是在开发过程中使用paster serve reload ...。该命令作为子进程执行自己(它使用subprocess模块而不是fork()执行自己的脚本)。在

子进程轮询源代码更改,在检测到更改时退出,并由父进程paster serve reload重新启动。在

也就是说,如果要分析paster serve本身,请忽略 reload参数。无论哪种方式,使用中间件分析单个请求都可以正常工作。在

我的特殊问题是pkg_resources在第一次调用时所花费的时间与所有已安装的包成比例。我通过重建我的virtualenv解决了这个问题,没有不必要的包。在

相关问题 更多 >