Voy a usar Python como un ejemplo ya que es lo que estoy utilizando para construir aplicaciones distribuidas enormes en este momento.
pitón Twisted permite un estilo muy imprescindible el uso de cualquiera de inlinecallbacks o estilos deferredGenerator (un poco más feas). Estos métodos le permiten escribir procedimientos que usan un código de devolución de llamada impulsado por eventos que es mucho más fácil de leer y comprender. La implementación convierte su función en una secuencia perezosa que produce una secuencia de diferidos.
Específicamente, no tiene que crear un conjunto de funciones de devolución de llamada/lambdas/closures profundamente anidados, y en su lugar puede ceder el control de una función al bucle de evento en puntos arbitrarios. Puede volver a etiquetar mentalmente esto como corrutinas o multitarea cooperativa si lo desea. Hace el trabajo. Un ejemplo sería (usando el estilo deferredGenerator más feo) como esto:
@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...
Hay otro post aquí que muestra el método inlineCallbacks, que es más limpio, pero requiere Python 2.5 o más reciente (es decir, no bajo Centos/RHEL 5 serie, que estoy tristemente atrapado con mi aplicación). Si puedes usarlo, hazlo.
Como puede ver, esto se parece a las cosas imperativas de python de la vieja escuela que conoce y ama, pero que es MUCHO más fácil de mantener sin una gran cantidad de funciones anidadas y lambdas. Aun así, me gustaría que Python tuviera bloques.
En cuanto a la depuración, puede activar la depuración de reactor retorcido mediante la llamada defer.setDebugging (True) en algún lugar de su código de inicialización. Esto adjuntará el rastreo original que generó una excepción en su código, de modo que pueda ver trivialmente dónde se produjo el error REALMENTE. Solo recuerde redactar la sentencia setDebugging antes de comenzar la producción, ya que resulta en una GRAN cantidad de introspección adicional (mire en voz alta si quiere estar completamente horrorizado).
cuidado para elaborar? – keyle