Je vais utiliser Python comme exemple car c'est ce que j'utilise pour construire d'énormes applications distribuées dès maintenant.
Twisted python permet une très impératif de style en utilisant soit inlinecallbacks ou (un peu plus laide) deferredGenerator les styles. Ces méthodes vous permettent d'écrire des procédures d'utilisation déterminées par les événements de rappel code qui est beaucoup plus facile à lire et à comprendre. L'application transforme votre fonction dans un paresseux séquence qui génère une séquence de deferreds.
Plus précisément, vous n'avez pas à construire une profondément imbriqués ensemble de fonctions de rappel/λ/fermetures, et peut, au lieu de céder le contrôle d'une fonction de retour de la boucle d'événements à points arbitraires. Vous pouvez mentalement ré-étiqueter ce que les coroutines ou le multitâche coopératif si vous le souhaitez. Il fait le travail. Un exemple serait (à l'aide de la plus laide deferredGenerator style) comme ceci:
@defer.deferredGenerator
def foo(arg):
bar = nonBlockingFunction(foo)
baz = waitForDeferred(aFunctionThatReturnsADeferredToo(bar))
yield baz #Returns control to the event loop
output = baz.getResult() #This gets the output of aFunctionThat...Too above
yield output #This is how we return a result instead of using return
@defer.deferredGenerator
def aFunctionThatReturnsADeferredToo(put_bar_here):
"""Stuff happens here...."""
...etc...
Il y a un autre post qui montre la inlineCallbacks méthode, qui est plus propre, mais nécessite python 2.5 ou plus récente (ce qui signifie pas sous Centos/RHEL 5 de la série, dont je suis malheureusement bloqué avec pour mon application). Si vous pouvez l'utiliser.
Comme vous pouvez le voir, cela ressemble à la vieille école python impératif de choses que vous connaissez et aimez, mais est beaucoup plus facile à maintenir sans une tonne de fonctions imbriquées et les lambdas. Je souhaite toujours python avait blocs.
Comme pour le débogage, vous pouvez activer tordu réacteur de débogage à l'aide de la reporter.setDebugging(Vrai) appeler quelque part dans votre code d'initialisation. Cela permettra de joindre l'original de sperme qui a soulevé une exception dans votre code, de sorte que vous pouvez trivialement voir où l'erreur s'est EFFECTIVEMENT produite. N'oubliez pas d'éditer le setDebugging déclaration avant d'aller en production, car il en résulte une ÉNORME quantité supplémentaire de l'introspection (regarder dans le strace si vous voulez être totalement horrifié).