NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

profiler.py (2358B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\werkzeug\contrib\profiler.py
      2 import sys
      3 try:
      4     try:
      5         from cProfile import Profile
      6     except ImportError:
      7         from profile import Profile
      8 
      9     from pstats import Stats
     10     available = True
     11 except ImportError:
     12     available = False
     13 
     14 class MergeStream(object):
     15 
     16     def __init__(self, *streams):
     17         if not streams:
     18             raise TypeError('at least one stream must be given')
     19         self.streams = streams
     20 
     21     def write(self, data):
     22         for stream in self.streams:
     23             stream.write(data)
     24 
     25 
     26 class ProfilerMiddleware(object):
     27 
     28     def __init__(self, app, stream = None, sort_by = ('time', 'calls'), restrictions = ()):
     29         if not available:
     30             raise RuntimeError('the profiler is not available because profile or pstat is not installed.')
     31         self._app = app
     32         self._stream = stream or sys.stdout
     33         self._sort_by = sort_by
     34         self._restrictions = restrictions
     35 
     36     def __call__(self, environ, start_response):
     37         response_body = []
     38 
     39         def catching_start_response(status, headers, exc_info = None):
     40             start_response(status, headers, exc_info)
     41             return response_body.append
     42 
     43         def runapp():
     44             appiter = self._app(environ, catching_start_response)
     45             response_body.extend(appiter)
     46             if hasattr(appiter, 'close'):
     47                 appiter.close()
     48 
     49         p = Profile()
     50         p.runcall(runapp)
     51         body = ''.join(response_body)
     52         stats = Stats(p, stream=self._stream)
     53         stats.sort_stats(*self._sort_by)
     54         self._stream.write('-' * 80)
     55         self._stream.write('\nPATH: %r\n' % environ.get('PATH_INFO'))
     56         stats.print_stats(*self._restrictions)
     57         self._stream.write('-' * 80 + '\n\n')
     58         return [body]
     59 
     60 
     61 def make_action(app_factory, hostname = 'localhost', port = 5000, threaded = False, processes = 1, stream = None, sort_by = ('time', 'calls'), restrictions = ()):
     62 
     63     def action(hostname = ('h', hostname), port = ('p', port), threaded = threaded, processes = processes):
     64         from werkzeug.serving import run_simple
     65         app = ProfilerMiddleware(app_factory(), stream, sort_by, restrictions)
     66         run_simple(hostname, port, app, False, None, threaded, processes)
     67 
     68     return action