例として Python を使用します。Python は現在、巨大な分散アプリケーションを構築するために使用しているものです。
Twisted python では、inlinecallbacks または (少し醜い) deferredGenerator スタイルのいずれかを使用して、非常に命令型のスタイルを使用できます。これらのメソッドを使用すると、読みやすく理解しやすいイベント ドリブン コールバック コードを使用するプロシージャを作成できます。実装により、関数が一連の deferred を生成する遅延シーケンスに変わります。
具体的には、コールバック関数/ラムダ/クロージャーの深くネストされたセットを構築する必要はなく、代わりに関数の制御を任意のポイントでイベント ループに戻すことができます。必要に応じて、これをコルーチンまたは協調マルチタスクとして精神的に再ラベル付けできます。それは仕事を成し遂げます。例は次のようになります (醜い deferredGenerator スタイルを使用):
@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...
inlineCallbacks メソッドを示す別の投稿がここにあります。これはよりクリーンですが、python 2.5 以降が必要です (Centos/RHEL 5 シリーズではなく、悲しいことに私のアプリで立ち往生しています)。使用できる場合は、そうしてください。
ご覧のとおり、これは、おなじみの古い学校の python 命令型のように見えますが、大量のネストされた関数やラムダがなくても維持するのははるかに簡単です。それでもPythonにブロックがあればいいのにと思います。
デバッグに関しては、初期化コードのどこかで defer.setDebugging(True) 呼び出しを使用して、ツイスト リアクターのデバッグをオンにすることができます。これにより、コードで例外を発生させた元のトレースバックが添付されるため、実際にエラーが発生した場所を簡単に確認できます。setDebugging ステートメントを本番環境に移行する前に編集することを忘れないでください。これにより、膨大な量の余分なイントロスペクションが発生するためです (完全に恐怖を感じたい場合は、strace で見てください)。