[Twisted-Python] Decorator @inlinecallbacks prohibiting memory profiling

Vikas vikas.c.kumar at oracle.com
Wed Oct 21 23:34:59 MDT 2015


Ok this experiment works fine because it doesn't have any decorator & 
generator.
Here is the actual method (with @inlineCallback and generator) where I 
see method(my_daemon_fun) being profiled with @profile decorator is not 
being profiled.
I am doubting that *generator* or *inlineCallback* decorator is 
prohibiting the correct code from getting profiled.

To profile the code all I need to do is:
  STEP#1 ->  decorate the _monitor_daemons() with "profile" decorator #1
  STEP#2 ->  start memory profiling  
  STEP#3 ->*  *end  memory profiling

Something like this:

@profile                                               => STEP#1
@inlineCallbacks
def my_daemon_fun(self):
     """
     Monitor my daemons
     """
     if self.running == True:
         try:
hp = hpy() => STEP#2
before = hp.heap()
             yield self._lock.acquire()
             .....
             if ((x_running == False) or (b_running == False)):
                 log.error('Daemons are not running, restarting...')
                 yield self._restart_daemons()
         except:
             log.exception('Exception restarting daemons')
         finally:
             yield self._lock.release()
             reactor.callLater(MY_DAEMON_MONITOR_INTERVAL, 
self.my_daemon_fun)
after = hp.heap() => STEP#3
leftover = after - before


Now we run the script to call method: my_daemon_fun(). After running the 
script though we see memory profiling happening but the function being 
profiled is *not* the one we decorated with @profile:

Line #    Mem usage    Increment      Line Contents
1176     42.3 MiB      0.0 MiB       def unwindGenerator(*args, **kwargs):
1177     42.3 MiB      0.0 MiB           try:
1178     42.3 MiB      0.0 MiB               gen = f(*args, **kwargs)
1183     42.3 MiB      0.0 MiB           if not isinstance(gen, 
types.GeneratorType):
1187     42.3 MiB      0.0 MiB           return _inlineCallbacks(None, 
gen, Deferred())


I am investigating why the actual function(i.e. my_daemon_fun()) was not 
profiled? Meanwhile if you can help us here that would be great.

Regards
Vikas

On 21/10/15 7:07 pm, Vikas wrote:
> Hi,
>
> I am trying to instrument method: run() for memory profiling(I am 
> using memory_profiler & guppy tools for this). All I need to do is 
> decorate the run() with "profile" decorator and mention *start* and 
> *end* of memory profiling.
>
> @profile
> def run():
>     d = {}
>     l = []
>     hp = hpy()
>     before = hp.heap()            => *start* memory profiling from here
>
>     d["k1"] = 'val1'
>     d["k2"] = 10
>     count = 0
>     while (count < 9):
>         l.append(count)
>         print 'The count is:', count
>         count = count + 1
>     print "Good bye!"
>     after = hp.heap()         => *end* memory profiling here
>     leftover = after - before
>
>     print leftover
>     del hp
>
>
> So far works fine. But moment I introduce @inlineCallbacks before 
> @profile(see below), I don't see memory getting profiled. Am I doing 
> something wrong here?
> @inlinecallbacks
> @profile
> def run():
>     ....
>
> Regards
> Vikas
>
>
>
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20151022/e9dbbcf6/attachment-0002.html>


More information about the Twisted-Python mailing list