2017-01-04 1 views
1

私は、私はここに参照としてTwisted's実装を使用しています非同期コードを作るinlineCallbacksは、同期コードの作業のように見えるかを理解しようとしていますはなぜツイストのinlineCallbacksは「繰延」オブジェクトを返すん

正常な機能を:?。。入力→出力

inlineCallbacks飾らジェネレータ機能:繰延→入力

それはDeferredすなわちcallbackに登録することができ、オブジェクト

をバック与えます。
from twisted.internet import defer 

intermediate_deferred = None 

@defer.inlineCallbacks 
def example(): 
    global intermediate_deferred 
    print("Started") 
    intermediate_deferred = defer.Deferred() 
    result = yield intermediate_deferred 
    print("Resuming for the first time with %s" % result) 
    intermediate_deferred = defer.Deferred() 
    result = yield intermediate_deferred 
    print("Resuming for the second time with %s" % result) 

generator_deferred = example() 
intermediate_deferred.callback("One") 
intermediate_deferred.callback("Two") 
  1. それを消費すなわち繰延オブジェクトを返すために、実際の必要性は何ですか?
  2. 誰が最終値でそれを呼び出しますか?
  3. 返されない場合はどうなりますか?

replこの戻り値が必要な理由はわかりません。私の根本的な問題は、私がまだこれらの機能の消費者を考えていないという事実から生じているようです。

だから、いくつかのWebフレームワークを取ると、コードがどうあるべきか想像してみましょう:

# Assume it returns 'example' function object. 
function_to_call = get_routing_function(request) 
d = function_to_call() 
# But who takes care of calling it back? The Event Loop has to do that? 
# So the Event Loop has one important job of monitoring and calling back 
# such Deferred's to complete the full cycle? 
d.addCallback(handle_http_response) 
@defer.inlineCallbacks 
def get_user_details(user_idn): 
    result = yield get_user_details_from_cache(user_idn) 
    if not result: 
     result = yield get_user_details_from_db(user_idn) 
    result = post_process_user_details(user_idn) 
    return result 
+0

誰かがこれがソフトウェア開発にもっと適していると思う人は、私に教えてください。そこに話題がある限り、私はそれを移行します。 – Nishant

答えて

0

がそれを消費すなわちDeferredオブジェクトを返すために、実際の必要性は何を?

このようなインラインコールバック関数をトリガーするコードは、後処理アクションをここに登録できます。 1つの例は、d.addCallback(handle_http_response)です。

誰が最終値で呼び出しますか?

インラインコールバックデコレータの機械はinternallyです。発電機がStopIterationになると、つまりreturnが外界に向かって最終的に発電機になったときに、このDeferredが発生します。対照的に、yield ed値はgeneratorの内部でのみ使用されます。

返されない場合はどうなりますか?

これらのジェネレータ関数は、副作用に対してのみ使用できます。つまり、これらの関数の出力値では何もできません。

関連する問題