use*_*965 4 python twisted deferred
我想知道Deferred执行的时间长度,从第一次回调被触发到最终结果.
关于如何做到这一点的任何想法,可能是以非侵入性的方式(意味着没有修改任何回调函数以跟踪执行时间)?
如果您在"twistd"的帮助下运行程序,那么它有一个选项"--profile"可以帮助您分析扭曲的代码.
twistd "other options" --profile=statsfile --profiler=cProfile --savestats
Run Code Online (Sandbox Code Playgroud)
并查看统计数据:
import pstats
stats = pstats.Stats('statsfile')
stats.sort_stats('time').print_stats()
Run Code Online (Sandbox Code Playgroud)
在触发延迟后立即执行回调.但是立即意味着延迟链中的每个回调都必须执行,并且它们将拥有自己的执行时间.此外,各种代码片段都有自己的执行时间片,包括反应器循环.
所以说出这个词 - 马上就要尽快说出来.
考虑以下不好的例子:
from twisted.internet import reactor, defer
import time
def timeit(func):
def wrapper(*arg):
t1 = time.time()
res = func(*arg)
t2 = time.time()
print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
return res
return wrapper
d = defer.Deferred()
@timeit
def callfunc1(result):
print 'XXXXX'
@timeit
def callfunc2(result):
print 'YYYYY'
d.addCallback(callfunc1)
d.addCallback(callfunc2)
t1 = time.time()
d.callback(True)
t2 = time.time()
print '%0.3f ms' % ((t2-t1)*1000.0)
Run Code Online (Sandbox Code Playgroud)
输出:
XXXXX
callfunc1 took 0.039 ms
YYYYY
callfunc2 took 0.005 ms
0.108 ms
Run Code Online (Sandbox Code Playgroud)
现在,如果我们调整上面的代码来包含reactor和callLater