""" Dump current deferred state. > Anyway, given a tree of deferreds, this will produce a whatever.dot > file, which can be fed to graphviz' "dot -Tpdf whatever.dot > > whatever.pdf", >and the pdf has a rather nice-looking graph of the > deferreds. http://twistedmatrix.com/pipermail/twisted-python/2012-July/025867.html have a look at this too: https://www.twistedmatrix.com/pipermail/twisted-python/2008-October/018535.html """ import gc import sys import twisted.internet.defer def escape(callback_type, obj): """Escape the callback.""" dummy = callback_type # noqa return '%s' % ( str(obj).replace(' ', '_') .replace(':', '').replace('<', '').replace('>', ''), ) def dump(outfile=sys.stdout): """Dump out data for a moment in time.""" outfile.write('digraph deferred_digraph {\n') for obj in gc.get_objects(): if isinstance(obj, twisted.internet.defer.Deferred): len_callbacks = len(obj.callbacks) if obj.callbacks: outfile.write( '\t%s -> %s\n' % ( escape('', obj), escape('', obj.callbacks[0][0][0]))) outfile.write( '\t%s -> %s\n' % ( escape('', obj), escape('', obj.callbacks[0][1][0]))) for callbackpairno in range(len_callbacks - 1): current_callback = obj.callbacks[callbackpairno][0] current_errback = obj.callbacks[callbackpairno][1] current_callback_desc = current_callback[0] current_errback_desc = current_errback[0] next_callback = obj.callbacks[callbackpairno + 1][0] next_errback = obj.callbacks[callbackpairno + 1][1] next_callback_desc = next_callback[0] next_errback_desc = next_errback[0] outfile.write( '\t%s -> %s;\n' % ( escape('callback', current_callback_desc), escape('callback', next_callback_desc))) outfile.write( '\t%s -> %s;\n' % ( escape('errback', current_errback_desc), escape('errback', next_errback_desc)) ) outfile.write( '\t%s -> %s;\n' % ( escape('callback', current_callback_desc), escape('errback', next_errback_desc)) ) outfile.write( '\t%s -> %s;\n' % ( escape('errback', current_errback_desc), escape('callback', next_callback_desc)) ) outfile.write('}\n')