我想知道 Deferred 从触发第一个回调到最终结果需要多长时间才能执行。
关于如何做到这一点的任何想法,可能以非侵入性方式(意味着不修改任何回调函数以跟踪执行时间)?
最佳答案
如果您在“twistd”的帮助下运行您的程序,那么它有一个选项“--profile”可以帮助您分析扭曲的代码。
twistd "other options" --profile=statsfile --profiler=cProfile --savestats
查看统计信息:
import pstats
stats = pstats.Stats('statsfile')
stats.sort_stats('time').print_stats()
回调在 deferreds 被触发后立即执行。但立即意味着延迟链中的每个回调都必须执行,并且它们将有自己的执行时间。此外,各种代码片段将有自己的执行时间片,包括 react 器循环。
所以说立即这个词就是说尽快。
考虑下面的坏例子:
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)
输出:
XXXXX
callfunc1 took 0.039 ms
YYYYY
callfunc2 took 0.005 ms
0.108 ms
现在,如果我们调整上面的代码以包含 react 器和 callLater
关于 python 扭曲: retrieve a deferred's execution time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4035912/