userò Python come un esempio come quello è quello che sto usando per costruire enormi applicazioni distribuite al momento.
pitone intrecciato permette uno stile molto imperativo utilizzando sia inlinecallbacks o (un po 'più brutti) stili deferredGenerator. Questi metodi consentono di scrivere procedure che utilizzano codice di callback basato sugli eventi che è molto più facile da leggere e comprendere. L'implementazione trasforma la tua funzione in una sequenza pigra che produce una sequenza di differimenti.
In particolare, non è necessario costruire un insieme di nidificazione di callback funzioni/lambda/chiusura, e può invece cedere il controllo di una funzione di nuovo al ciclo di eventi in punti arbitrari. Puoi etichettarlo mentalmente come coroutine o multitasking cooperativo se vuoi. Ottiene il lavoro fatto. Un esempio potrebbe essere (utilizzando lo stile deferredGenerator più brutto) come questo:
@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...
V'è un altro post qui che mostra il metodo inlineCallbacks, che è più pulita, ma richiede Python 2.5 o più recente (cioè non sotto CentOS/RHEL 5 serie, di cui sono tristemente attaccato per la mia app). Se puoi usarlo DO SO.
Come potete vedere, questo assomiglia alle cose imperative del vecchio pitone della scuola che conosci e ami, ma è SEMPRE più facile da mantenere senza un sacco di funzioni nidificate e lambda. Comunque desidero che Python abbia blocchi.
Come per il debug, è possibile attivare il debug del reattore a torsione utilizzando la chiamata defer.setDebugging (True) da qualche parte nel codice di inizializzazione. Questo allegherà il traceback originale che ha generato un'eccezione nel codice, in modo che sia possibile vedere banalmente dove si è verificato l'errore EFFETTIVAMENTE. Ricorda solo di ridimensionare la dichiarazione setDebugging prima di andare in produzione, perché si ottiene una quantità enorme di introspezione extra (guardala in silenzio se vuoi essere completamente inorridito).
cura di elaborare? – keyle