Si vous exécutez votre programme avec l'aide de "twistd", alors il a une option "--profile" qui peut vous aider à profiler le code tordu.
twistd "other options" --profile=statsfile --profiler=cProfile --savestats
Et pour voir les statistiques:
import pstats
stats = pstats.Stats('statsfile')
stats.sort_stats('time').print_stats()
sont exécutés immédiatement Callbacks après les deferreds sont tirés. Mais cela signifie immédiatement que chaque rappel dans la chaîne différée doit être exécuté et qu'ils auront leur propre temps d'exécution. De plus, divers morceaux de code auront leur propre tranche de temps pour l'exécution, y compris la boucle du réacteur. Donc, pour dire le mot - immédiatement, c'est dire le plus tôt possible.
Prenons l'exemple mauvais suivant:
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)
Sortie:
XXXXX
callfunc1 took 0.039 ms
YYYYY
callfunc2 took 0.005 ms
0.108 ms
Maintenant, si nous modifions le code ci-dessus pour inclure un réacteur et callLater
@ user304965: J'ai hésité à donner une réponse comme celle-ci, principalement parce que vous devez instrumenter vos rappels pour le profilage. C'est possible si vous écrivez votre propre code. Pourtant, il est moche d'instrument de code à cet effet. Mais si vous utilisez des rappels du module d'un autre, vous ne pouvez même pas le faire. L'idée est que les rappels vont se déclencher immédiatement mais cela dépend de beaucoup de choses qui circulent. – pyfunc