私は、私はここに参照として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")
- それを消費すなわち繰延オブジェクトを返すために、実際の必要性は何ですか?
- 誰が最終値でそれを呼び出しますか?
- 返されない場合はどうなりますか?
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
誰かがこれがソフトウェア開発にもっと適していると思う人は、私に教えてください。そこに話題がある限り、私はそれを移行します。 – Nishant