首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何分析` `paster serve`的启动时间?

如何分析` `paster serve`的启动时间?
EN

Stack Overflow用户
提问于 2009-11-10 00:11:40
回答 3查看 535关注 0票数 2

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

我知道如何使用中间件分析请求,但是如何分析初始化时间?我希望它不要派生一个线程池,一旦准备好就退出,这样它准备好后的时间就不会出现在配置文件中。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-11 02:35:08

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

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

这就是说,如果您打算分析paster serve本身,请省略--reload参数。无论哪种方式,使用中间件分析单个请求都应该可以很好地工作。

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

票数 1
EN

Stack Overflow用户

发布于 2009-11-10 00:15:03

通常,您的方法可以是在代码段周围执行计时块,然后发出日志语句。至于init之后的关机,我不太熟悉你所使用的细节。

编辑:我已经使用了这个中间件来帮助我找到性能漏洞。它目前是一个werkzeug中间件,您可以根据自己的使用情况对其进行调整。希望能有所帮助

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2009-11-10 03:23:18

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

我们在mod_wsgi设置中使用Paster,为了减少启动时间,以便用户不会受到影响,并确保正确设置toscawidgets,我们这样做:

代码语言:javascript
复制
app = paste.fixture.TestApp(application)
# TODO-dir: FIXME, must go away!
try:
    app.get("/")
except:
    pass

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1702024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档