2012-04-06 2 views
7

Как профиль код питона под Google App Engine выполнения python27?Как профиль Google App Engine python27 выполнения (не питон)

Во время исполнения питона это было сделано этим кодом - python runtime:

from google.appengine.ext import webapp 

class PageHandler(webapp.RequestHandler): 
    def get(self): 
    self.response.headers['Content-Type'] = 'text/plain' 
    self.response.out.write('Hello, WebApp World!') 

def real_main(): 
    application = webapp.WSGIApplication([('/', PageHandler)], debug=True) 
    run_wsgi_app(application) 

def profile_main(): 
    # This is the main function for profiling 
    # We've renamed our original main() above to real_main() 
    import cProfile, pstats, StringIO 
    prof = cProfile.Profile() 
    prof = prof.runctx('real_main()', globals(), locals()) 
    stream = StringIO.StringIO() 
    stats = pstats.Stats(prof, stream=stream) 
    stats.sort_stats('cumulative') 
    logging.info("Profile data:\n%s", stream.getvalue()) 

if __name__ == "__main__": 
    profile_main() 

Во время исполнения python27 это должно быть сделано по-разному, так как нет главных вызовов - как сделать то же самое - Я хочу перейти на python27, но не без профилирования. Как подключить профилировщик в python27 - python27 runtime?

import webapp2 

class PageHandler(webapp2.RequestHandler): 
    def get(self): 
     self.response.headers['Content-Type'] = 'text/plain' 
     self.response.out.write('Hello, WebApp World!') 

app = webapp2.WSGIApplication([('/', PageHandler)]) 
+0

'Вы все еще можете указать обработчик CGI скриптов в app.yaml.' If Я правильно понимаю, вы все равно можете использовать старые способы, если вам не нужны «параллельные запросы» – Dikei

+0

Возможно, но использование app.yaml не очень хорошо, так как вы хотите протестировать без cgi и не редактировать app.yaml каждый тест (он медленный) , – Chameleon

ответ

14

Вы можете профилировать приложения WSGI с помощью WSGI промежуточного уровня, вставив в вашем appengine_config.py:

import cProfile 
import cStringIO 
import logging 
import pstats 

def webapp_add_wsgi_middleware(app): 

    def profiling_wrapper(environ, start_response): 
    profile = cProfile.Profile() 
    response = profile.runcall(app, environ, start_response) 
    stream = cStringIO.StringIO() 
    stats = pstats.Stats(profile, stream=stream) 
    stats.sort_stats('cumulative').print_stats() 
    logging.info('Profile data:\n%s', stream.getvalue()) 
    return response 

    return profiling_wrapper 
+0

Выглядит неплохо Я проверю его скоро ... – Chameleon

+0

Отличное решение! – Chameleon

6

Вы также можете просто упасть в App Engine Mini Profiler, который заботится об этом заклинании для вас и дает результаты на каждой странице, которая была профилирована.

Это обеспечивает как вызов API перфорация информации (через Appstats) и стандартные данные профилирования для всех вызовов функций (через cProfiler)

https://github.com/kamens/gae_mini_profiler

Смежные вопросы