コールバック機能を管理するために、繰延オブジェクトに使用されるねじれのPythonフレームワーク

自然に不可欠となっているコールバック関数を使用し、特性ツイスト非同期および非ブロックモードの話をするとき、我々はコールバック関数の使用を管理するために、繰延オブジェクトで使用されるPythonのツイストフレームワークを見てみましょう。
まず投げます私たちの見解のいくつかのコールバックプログラミングの使用を議論する場合:

アクティベーションエラーバックは非常に重要です。ブロックを除き、エラーバックと同じ機能するため、ユーザーはその存在を確認する必要がありそう。彼らは任意ですが、必須ではありません。
ない時間で間違ったポイントの活性化と活性化コールバックコールバック時の右の点でも同様に重要。典型的な使い方は、コールバックされ、エラーバックのみそれらのいずれかを実行できるよう、相互に排他的です。
やや困難なコードのコールバック関数を使用すると、それらを再構成します。
繰延
コールバック関数を管理するために繰延オブジェクトを使用してツイストシーケンス。いくつかのケースでは、非同期動作が完了したときには、(これらのコールバック関数の一連のコールバック関数鎖とも呼ばれる)の順序で呼び出すことが繰延オブジェクトに関連する一連の機能を取ることができる;しかし、いくつかの機能があり、非同期動作に現れます例外を呼び出します。操作が完了すると、最初の呼び出しのコールバック、またはエラーが発生した場合、エラーは最初の最初のコールバック処理を呼び出し、各繰延オブジェクトの値を戻しますが渡さ関数またはエラーハンドラのコールバック関数をコールバックする時期チェーン内の次の機能。
コールバック
twisted.internet.defer.Deferredが将来的に関数の結果を生成するモーメントを表すオブジェクト。当社は、繰延オブジェクトかつて結果は、コールバック関数が呼び出され、繰延オブジェクトにコールバック関数を関連付けることができます。また、繰延オブジェクトは、開発者がエラーハンドラのコールバック関数に登録することができます。ブロックまたは遅延操作の多種多様のための繰延メカニズムは、開発者のための標準化されたインタフェースを提供します。
twisted.internet輸入リアクター、延期から

def getDummyData(inputData):
  """
  This function is a dummy which simulates a delayed result and
  returns a Deferred which will fire with that result. Don't try too
  hard to understand this.
  """
  print('getDummyData called')
  deferred = defer.Deferred()
  # simulate a delayed result by asking the reactor to fire the
  # Deferred in 2 seconds time with the result inputData * 3
  reactor.callLater(2, deferred.callback, inputData * 3)
  return deferred
 
def cbPrintData(result):
  """
  Data handling function to be added as a callback: handles the
  data by printing the result
  """
  print('Result received: {}'.format(result))
 
deferred = getDummyData(3)
deferred.addCallback(cbPrintData)
 
# manually set up the end of the process by asking the reactor to
# stop itself in 4 seconds time
reactor.callLater(4, reactor.stop)
# start up the Twisted reactor (event loop handler) manually
print('Starting the reactor')
reactor.run()

コールバック関数複数の
据え置きオブジェクトに、コールバックを複数に関連付けることができ、最初のコールバック関数でコールバック関数がコールへのパラメータ、および最初のコールバック関数への第2としての鎖繰延オブジェクトをもたらします呼び出しに、というようにパラメータの結果。なぜ私たちは、このようなAの仕組みが必要なのでしょうか?HTML形式にクエリ結果を変換するために、繰延オブジェクトにコールバック関数を追加するSQLクエリの結果を、ウェブ・ウィンドウがあるかもしれません- twisted.enterprise.adbapiは繰延オブジェクトを返し、このような状況を考えてみましょう前方の繰延オブジェクトを渡すために継続し、その後、その後、ツイストは、コールバック関数を呼び出しますし、その結果をHTTPクライアントに返します。エラーや異常、コールバックチェーンの場合には呼び出されません。

	from twisted.internet import reactor, defer
 
 
class Getter:
  def gotResults(self, x):
    """
    The Deferred mechanism provides a mechanism to signal error
    conditions. In this case, odd numbers are bad.
 
    This function demonstrates a more complex way of starting
    the callback chain by checking for expected results and
    choosing whether to fire the callback or errback chain
    """
    if self.d is None:
      print("Nowhere to put results")
      return
 
    d = self.d
    self.d = None
    if x % 2 == 0:
      d.callback(x * 3)
    else:
      d.errback(ValueError("You used an odd number!"))
 
  def _toHTML(self, r):
    """
    This function converts r to HTML.
 
    It is added to the callback chain by getDummyData in
    order to demonstrate how a callback passes its own result
    to the next callback
    """
    return "Result: %s" % r
 
  def getDummyData(self, x):
    """
    The Deferred mechanism allows for chained callbacks.
    In this example, the output of gotResults is first
    passed through _toHTML on its way to printData.
 
    Again this function is a dummy, simulating a delayed result
    using callLater, rather than using a real asynchronous
    setup.
    """
    self.d = defer.Deferred()
    # simulate a delayed result by asking the reactor to schedule
    # gotResults in 2 seconds time
    reactor.callLater(2, self.gotResults, x)
    self.d.addCallback(self._toHTML)
    return self.d
 
 
def cbPrintData(result):
  print(result)
 
 
def ebPrintError(failure):
  import sys
  sys.stderr.write(str(failure))
 
 
# this series of callbacks and errbacks will print an error message
g = Getter()
d = g.getDummyData(3)
d.addCallback(cbPrintData)
d.addErrback(ebPrintError)
 
# this series of callbacks and errbacks will print "Result: 12"
g = Getter()
d = g.getDummyData(4)
d.addCallback(cbPrintData)
d.addErrback(ebPrintError)
 
reactor.callLater(4, reactor.stop)
reactor.run()

もう一つ注意すべきは、中に処理方法のgotResults self.d道ということです。繰延オブジェクトがエラーまたは活性化の結果である前に、このプロパティはゲッターインスタンスが遅延オブジェクトを活性化することがもはや保持するので、いずれになるないように設定されています。これは、時々 、(これはAlreadyCalledError例外が発生します)同じ繰延オブジェクトの起動を繰り返しGetter.gotResultsの可能性を回避するために、まず、いくつかの利点があります。第二には、そうすることは問題なく、コールバック関数Getter.getDummyData関数を呼び出し繰延オブジェクトに追加することが可能となります。Pythonは、オブジェクトが基準サイクルにより回収するかどうかを検出することが容易であるように、さらに、ガベージコレクタ。
説明の可視化は
、本明細書に書き込み絵を説明ここに画像を挿入説明
繰延オブジェクトが返さ与えるために、1.メソッドの要求リクエストデータのデータシンクに。
2.オブジェクトを繰延コールバック関数への要求を関連付ける方法。ここに画像を挿入説明
1.結果の準備が整ったら、繰延オブジェクトに渡します。操作が成功した場合の動作は、(faliure)繰延オブジェクトを.errback呼び出しに失敗した場合、繰延オブジェクト.callback(結果)法と呼ばれています。障害がクラスtwisted.python.failure.Failureのインスタンスであることに注意してください。
エラー処理を追加したり、コールバック関数の前にコールバック関数を有効にするには、結果またはfaliureを使用して2.Deferredオブジェクト。その後、次の規則がコールバック関数ダウン鎖に沿って進行する:
最初の引数は、従ってプロセッサの鎖を形成する、次のコールバック関数に渡されるように結果のコールバック関数が常に使用されます。
コールバックが例外をスローした場合は、エラー処理を実行するためにコールバック関数になります。
faliureが扱われていない場合、それはコールバック関数を扱うチェーンエラーに沿って受け継がれているだろう、それは少しの文を除く非同期バージョンのようなものです。
エラー処理コールバック関数が例外をスローしたりtwisted.python.failure.Failureインスタンスを返さない場合は、残りの部分は、コールバック関数に転送されます。
エラー処理コールバック
繰延オブジェクトモデルをエラー処理はPythonベースの例外処理に基づいています。上記のようにエラーが存在しないこと、およびすべてのコールバックでは、一つずつ実行されます。
ノーコールバック関数が、コールバック関数を処理を行う誤差(のようなDBクエリのエラーが発生した)場合は、twisted.python.failure.Failureオブジェクトは、(あなたが複数のエラーを追加することができ、コールバック関数を扱う最初のエラーに渡されます)コールバックチェーンのように、コールバック関数を扱います。エラー処理機能は、通常のPythonコードとしてチェーン以外のコードブロックをコールバックすることができます。
コードブロックを除き、明示的にエラーを発生させる、またはExceptionオブジェクトは、キャプチャされ、ダウン広がっていきませんし、その後適切にプログラムを実行し始めました。あなたが明示的にFaliureまたは再スロー例外を返していない限り同じことが、コールバックチェーンをエラー処理のために真である、またはエラー意志停止は広がり続け、そしてそこから、それは通常のコールバック関数チェーン(エラー処理を開始しますコールバック関数の戻り値)。コールバック関数をエラー処理がFaliureを返すか、例外をスローした場合は、Faliureまたは異常は、次のエラーハンドラのコールバック関数に渡されます。
コールバック関数を処理し、エラーが何も返さない場合、それは実際にエラーが発生した後にコールバック関数の実行を扱うことを意味し、コールバックチェーンの実行を継続しますNoneを返さないことに注意してください。これには、必ずあなたのエラーはコールバック関数を処理させることFaliureは、次のコールバック関数にオブジェクト(またはFaliureパラメータに渡されるオブジェクト)または意味の戻り値を返す、あなたが実際に何を期待おそらくではありません。
twisted.python.failure.Failureあなたが別のフォームより効率的に次のコードを作ることができ、有用な方法は、トラップと呼ばれています。

try:
  # code that may throw an exception
  cookSpamAndEggs()
except (SpamException, EggException):
  # Handle SpamExceptions and EggExceptions
  ...

以下のように書くことができます。

def errorHandler(failure):
  failure.trap(SpamException, EggException)
  # Handle SpamExceptions and EggExceptions
 
d.addCallback(cookSpamAndEggs)
d.addErrback(errorHandler)

あなたはfaliure.trapにパラメータを渡すと一致するとFaliureミスすることができ、それがすることをこのエラーを再スローしません。
addErrback機能上の注意、twisted.internet.defer.Deferred.addCallbacksメソッド機能メソッドとaddCallbackトークの必要性がある場合には似ていますが、まったく同じではありません。次のような状況を考えてみます。

# Case 1
d = getDeferredFromSomewhere()
d.addCallback(callback1)    # A
d.addErrback(errback1)     # B
d.addCallback(callback2)
d.addErrback(errback2)
 
# Case 2
d = getDeferredFromSomewhere()
d.addCallbacks(callback1, errback1) # C
d.addCallbacks(callback2, errback2)

エラーがcallback1内部で発生した場合、ケース1の場合は、その後、errback1が呼び出されます。ケース2の場合、それはerrback2はいますが呼ばれています。
エラーまたはcallback1線Aを行う場合getDeferredFromSomewhere処理を行う場合、実際には、ケース1で、行AのプロセスgetDeferredFromSomewhereが正常に実行されます、ので、線Bが発生します。ケース2の一方で、errback1の列CにのみgetDeferredFromSomewhere実行発生したエラーに対処し、エラーが発生したcallback1については責任を負いませんでしょう。
未処理のエラー
であれば繰延オブジェクト、その後、未処理のエラーがガベージコレクタをオフにクリアされツイストがある場合(、であるそれは確かに呼び出されます次のエラーバックを持っている場合)、このエラートレースバックレコードへの意志ログファイル。この手段は、あなたはまだエラーバックのエラーを追加せずに記録することができるかもしれません。あなたは繰延オブジェクト参照を保持している場合しかし、注意してください、そして、あなたは、このエラーを見ることはありません、ガベージコレクタをクリーンアップすることはありません(とあなたのコールバックが神秘的に実行することはありません)。あなたは上記のような状況が発生したかどうかわからない場合は、明示的にもちょうど記述する場合、コールバックチェーンの後にエラーバックを追加する必要があります。

# Make sure errors get logged
from twisted.python import log
d.addErrback(log.err)

同期および非同期処理の結果
、一部のアプリケーションでは機能が、それはまた、同期している可能性があり、非同期の機能があるでしょう。それはすぐに結果を返すことができるように、ユーザがメモリから認証されているかどうかをチェックする場合は、例えば、ユーザ認証機能は、;しかし、それはネットワーク上のデータを待つ必要がある場合、それはデータの到着が作動し返す必要があるとき繰延オブジェクト。すなわち、ユーザが同時に機能し、認証結果を受け入れることができるようにする必要があると繰延オブジェクトがすぐに戻ってきたかどうかを確認したい人、と言うことです。
次の例は、のauthenticateUser isValidUserは、ユーザーを認証するために使用しました:

def authenticateUser(isValidUser, user):
  if isValidUser(user):
    print("User is authenticated")
  else:
    print("User is not authenticated")

この機能は、isValidUserがすぐに返さ想定しているが、実際にisValidUserは、ユーザーと戻っ繰延オブジェクトを認証する非同期かもしれません。この関数はisValidUserがisValidUserが可能である両方の同期非同期レシーバ缶を受け調整されます。繰延オブジェクトに同期化関数の戻り値は可能であるが。
ライブラリ関数のコードで可能繰延オブジェクト処理
のauthenticateUserを同期させるユーザ認証方法に送信される可能性があります。

def synchronousIsValidUser(user):
  '''
  Return true if user is a valid user, false otherwise
  '''
  return user in ["Alice", "Angus", "Agnes"]

これは、ユーザ認証の非同期方式である遅延オブジェクトを返します。

from twisted.internet import reactor, defer
 
def asynchronousIsValidUser(user):
  d = defer.Deferred()
  reactor.callLater(2, d.callback, user in ["Alice", "Angus", "Agnes"])
  return d

authenticateUser isValidUserを達成するための我々の最初の希望は同期されているが、今では両方の同期を処理するように変更すると、非同期isValidUserが達成扱うことができる必要があります。この点で、あなたはmaybeDeferred isValidUserを呼び出すための関数を使用することができ、この機能はisValidUserが同期機能であっても、関数の戻り値はisValidUserが繰延オブジェクトであることを確認することができます:

from twisted.internet import defer
 
def printResult(result):
  if result:
    print("User is authenticated")
  else:
    print("User is not authenticated")
 
def authenticateUser(isValidUser, user):
  d = defer.maybeDeferred(isValidUser, user)
  d.addCallback(printResult)

今isValidUser同期または非同期のいずれかを持っていたことができます。
関数はsynchronousIsValidUserに書き換えてもよいし、遅延オブジェクトを返すここで見つけることができます。
コールバック関数のキャンセル
動機を繰延オブジェクトは、コールバック関数を呼び出すために長い時間がかかる、とさえ呼ばれないことがあります。時には繰延リターン結果を待つように良い忍耐ではないかもしれません。すべてのコードは、アプリケーションでの据え置きやライブラリを呼び出すの完了後に実行するので、あなたは結果が受信される前に長い時間が経過している場合の結果を無視することを選択することができます。あなたはこの結果を無視することを選択した場合でもしかし、この作業の基礎となるオペレーティング繰延オブジェクトがまだバックグラウンドで生成され、そして、そのようなCPU時間、メモリ、ネットワーク帯域幅、さらにはディスク容量などのマシンのリソースを消費しています。そのため、ユーザーがウィンドウを閉じたときに、[キャンセルボタン、切断したり、サーバーから「停止」コマンドを送信し、本来の動作のあなたの結果は、もはや前に明示的に宣言する必要がありますをクリックしてください興味を持って、その本来の繰延オブジェクトは、いくつかのクリーンアップ作業を行うと、リソースを解放できること。
これは単純な例では、外部機器に接続したいが、あなたは、ユーザーが別のマシンに接続できるように、アプリケーション内の接続試行を終了するには、[キャンセル]ボタンを追加する必要があるので、マシンが、遅すぎます。これはおそらく、このようなアプリケーションのロジックです。

def startConnecting(someEndpoint):
  def connected(it):
    "Do something useful when connected."
  return someEndpoint.connect(myFactory).addCallback(connected)
# ...
connectionAttempt = startConnecting(endpoint)
def cancelClicked():
  connectionAttempt.cancel()

明らかに、いくつかのUI要素によってstartConnectingは、ユーザが接続されているマシンを選択できるようにするために使用されます。次に、[キャンセル]ボタンをcancelClicked機能に付随しています。
connectionAttempt.cancelが呼び出されると、次のアクションが発生します。

潜在的な接続操作で結果として、それがまだ進行中である場合は、終了し、
どのような場合には、繰延オブジェクトが適時に完了するconnectionAttemptが作る
エラーハンドラCancelledError間違ったコールのでconnectionAttemptに繰延オブジェクトを引き起こすことがあり
、操作が基本となるが発現するようにキャンセルされた場合でも、操作は停止する必要があるが、基本的な操作はすぐに反応する可能性は低いです。でも、この単純な例では、中断されていない操作があります:DNS、そのためのスレッドで実行する必要がありますが、ドメイン名解決の取り消しを待っている間に、アプリケーションができない場合、操作に参加します。あなたは繰延オブジェクトをキャンセルするように、コールバック関数を処理するコールバック、直ちに機能やエラーを起動しない場合があります。

繰延オブジェクトは、コールバック・チェーンの実行中の任意の時点で別の繰延オブジェクトの完了を待つことができます。すべてが特定のポイントのコールバックチェーンで準備ができているかどうかを知る方法はありません。あるかもしれないので、多くは繰延オブジェクトをキャンセルするコールバックチェーン願いのレベルで機能しますので、機能の任意のレベルは、チェーン上の任意の時点で可能性の高いコール.cancel()関数にしています。.cancel()関数は決して例外または戻り値なしを投げていません。あなたは、繰延オブジェクトがアクティブ化されている場合でも、それを思い出すことができない、それは何のコールバック関数を残りました。
同時に繰延オブジェクトの例では、あなたがそれを解除与えることができます(コンストラクタ繰延オブジェクトがDEFでのinit(セルフ、セラ=なし):(出所))、キャンセラーは何もすることができます。理想的には、それはあなたが要求する前に、動作を停止するために全力を尽くすだろうが、常にこれを保証するものではありません。だから、繰延オブジェクトをキャンセルちょうど私のベストを尽くします。いくつかの理由があります。
繰延オブジェクトは、下をキャンセルする方法を知りません。
それはいくつかの不可逆的なアクションを実行した可能性があるため、操作の基礎となることは、取消不能の状態に行われています。
繰延オブジェクトは、結果であったかもしれない、そうまでキャンセルすることは何もありません。
かかわらず、それがキャンセル可能かどうかの、常に成功した結果が得られますコール)(キャンセル機能した後、エラー状況が発生しません。第一及び第二のケースでは、基礎となる動作が継続、繰延ラージ・オブジェクトは、そのエラーバックtwisted.internet.defer.CancelledErrorパラメータとして呼び出すことができます。
あなたは繰延オブジェクトが別の繰延オブジェクトを待っている取り消す場合は、操作は、この繰延オブジェクトを楽しみに渡されますキャンセル。
あなたはAPIを参照することができます。
キャンセルするデフォルトの動作
すべてのオブジェクトがキャンセル繰延が、唯一の非常に単純な行為を提供し、またすべてのリソースを解放サポートしています。
次の例を考えてみます。

operation = Deferred()
def x(result):
  print("Hooray, a result:" + repr(x))
operation.addCallback(x)
# ...
def operationDone():
  operation.callback("completed")

あなたはこの操作の繰延オブジェクトをキャンセルする必要がありますが、操作をキャンセル機能を解除しなかった場合、それは以下の二つのうちの一つで結果を生成します:
もしoperationDoneが完了しているオブジェクトの操作である、と呼ばれてきた、何も変更されます。そう見ることができるかについての行動に変化がない、操作はまだ結果を持っていますが、他のコールバック関数が存在しないからです。
operationDoneがまだ呼び出されていない場合は、操作はすぐにCancelledErrorのエラーバックへのパラメータとして有効になります。
通常の状況下では、繰延オブジェクトが来た場合AlreadyCalledErrorにつながるコール・コールバックへのコールバック関数を呼び出します。したがって、コールバックがキャンセルされているかもしれませんが、繰延オブジェクトが再びキャンセラーと呼ばれていない、唯一のノーオペレーションにつながります。あなたが繰り返しコールバックを呼び出す場合は、AlreadyCalledError例外が発生します。
繰延オブジェクトをキャンセルすることができます作成:カスタム機能を解除
しますが、HTTPクライアントを実装すると仮定し、サーバーが返す戻り、応答をするとき繰延オブジェクトをアクティブになります。キャンセル接続を閉じることをお勧めします。そうするための機能、(繰延オブジェクトは、この関数を呼び出しますキャンセルされる)のパラメータとしてコンストラクタ繰延オブジェクトに渡すことができる機能を解除するために:

class HTTPClient(Protocol):
  def request(self, method, path):
    self.resultDeferred = Deferred(
      lambda ignore: self.transport.abortConnection())
    request = b"%s %s HTTP/1.0\r\n\r\n" % (method, path)
    self.transport.write(request)
    return self.resultDeferred
 
  def dataReceived(self, data):
    # ... parse HTTP response ...
    # ... eventually call self.resultDeferred.callback() ...

あなたは繰延オブジェクトHTTPClient.request()リターン()関数をキャンセル呼び出す場合(ない後半既に場合)さて、HTTPリクエストがキャンセルされます。キャンセラー付き繰延オブジェクトのコールバックを()を呼び出し、キャンセルされたとしてもで、それを注意してください。
DeferredListは
時々 、あなたは、いくつかの異なるイベントが行われているが、誰もが事件について通知されます後に通知されるようにしたいです。たとえば、すべての接続がクローズされているのリストを待ちたいです。twisted.internet.defer.DeferredListが、この場合に適用されます。
DeferredListを作成するために、複数のオブジェクトを延期、単にあなたが繰延オブジェクトを待ちたいものにリストを渡します。

DeferredListを作成します。

DL = defer.DeferredList([deferred1、deferred2、deferred3])

今、あなたは、ルックアップするために、たとえば、あなたもaddCallbacksなどを呼び出すことができます普通の繰延DeferredListとしてそれを使用することができます。繰延オブジェクトのすべてが完了した後、このDeferredListはそのコールバック関数を呼び出します。このコールバックパラメータはすべて、このDeferredList繰延オブジェクトのオブジェクトは、次のようなリターン結果のリストが含まれています:

# A callback that unpacks and prints the results of a DeferredList
def printResult(result):
  for (success, value) in result:
    if success:
      print('Success:', value)
    else:
      print('Failure:', value.getErrorMessage())
 
# Create three deferreds.
deferred1 = defer.Deferred()
deferred2 = defer.Deferred()
deferred3 = defer.Deferred()
 
# Pack them into a DeferredList
dl = defer.DeferredList([deferred1, deferred2, deferred3], consumeErrors=True)
 
# Add our callback
dl.addCallback(printResult)
 
# Fire our three deferreds with various values.
deferred1.callback('one')
deferred2.errback(Exception('bang!'))
deferred3.callback('three')
 
# At this point, dl will fire its callback, printing:
#  Success: one
#  Failure: bang!
#  Success: three
# (note that defer.SUCCESS == True, and defer.FAILURE == False)

DeferredListは、通常はエラーバック呼び出すことはありませんが、Trueに設定cousumeErrors、繰延オブジェクトで生成されたそれ以外の場合はエラーがない限り、まだそれぞれのエラーバックのための繰延オブジェクトをアクティブにします。
あなたが行くために繰延オブジェクトDeferredListにアプリケーションのコールバック関数に追加したい場合は、その後、あなたはコールバック関数を追加するために、時間に注意を払う必要があることに注意してください。DeferredListに繰延オブジェクトは、繰延オブジェクトにもつながる追加のコールバックに追加されます(実行するためにコールバック関数、その機能はDeferredListが完了したかどうかを確認することです)。最も重要なのは、この変数コールバック関数は、繰延オブジェクトの戻り値を記録し、パラメータリストとしてコールバック関数に最終DeferredListにこの値を渡します。
あなたは繰延オブジェクトを提供しているのであれば、DeferredListに追加繰延、戻り値は新しく追加されたコールバック関数DeferredListのコールバック関数に渡されることはありません後にコールバック関数に追加されます。この状況を回避するには、中にDeferredListに繰延オブジェクトを追加した後に繰延追加コールバックを与えないことをお勧めします。

def printResult(result):
  print(result)
 
def addTen(result):
  return result + " ten"
 
# Deferred gets callback before DeferredList is created
deferred1 = defer.Deferred()
deferred2 = defer.Deferred()
deferred1.addCallback(addTen)
dl = defer.DeferredList([deferred1, deferred2])
dl.addCallback(printResult)
deferred1.callback("one") # fires addTen, checks DeferredList, stores "one ten"
deferred2.callback("two")
# At this point, dl will fire its callback, printing:
#   [(True, 'one ten'), (True, 'two')]
 
# Deferred gets callback after DeferredList is created
deferred1 = defer.Deferred()
deferred2 = defer.Deferred()
dl = defer.DeferredList([deferred1, deferred2])
deferred1.addCallback(addTen) # will run *after* DeferredList gets its value
dl.addCallback(printResult)
deferred1.callback("one") # checks DeferredList, stores "one", fires addTen
deferred2.callback("two")
# At this point, dl will fire its callback, printing:
#   [(True, 'one), (True, 'two')]

fireOnOneCallback、fireOnOneErrbackとcousumeErrors:その動作をカスタマイズするために、3つの主要なパラメータを受け入れるDeferredList。あなたがfireOnOneCallbackを設定した場合は、限り、繰延オブジェクトは、そのコールバック関数を呼び出すがあるので、DeferredListはすぐにコールバック関数を呼び出します。あなたがfireOnOneErrbackを設定した場合も、限り、延期と呼ばれるエラーバックがあるとして、DeferredListはエラーバックを呼び出します。注、ワンタイムDeferredListは、そのコールバックやエラーバック呼び出しの後に、それは何もしません(それはその結果のすべてに繰延パスにそれを無視します)。
あなたはすべてのものを成功裏に実施するのを待つだけでなく、エラーが非常に便利であるとき、すぐに知っておく必要がありますしたい場合にはfireOnOneErrbackオプション。
DeferredListオブジェクトの確立が元の繰延オブジェクトそれぞれerrbacksのそれぞれに渡されることはありません後に延期オブジェクトconsumeErrors誤差はDeferredListパラメータが生成中に含まれるであろう。DeferredListオブジェクトを作成した後、生成された単一の遅延オブジェクト内のすべてのエラーは、コールバック呼び出しの結果なしに変換されます。このオプションの防止は、繰延で、それは(そうでない場合、それは各エラーバック繰延オブジェクトの警告を追加する必要性を排除する必要があります)余分なerrbacksを追加せずに、警告「繰延で未処理のエラー」が含まれています。consumeErrorsへの真のパラメータがfireOnOneCallbackとfireOnOneErrbackの動作には影響しません渡します。あなたは将来繰延オブジェクトにこれらのリストにコールバックやerrbacksを追加する場合を除き、あなたはいつも、このパラメータを使用する必要があります、またはあなたが知っている限り、彼らはエラーを生成しません。それ以外の場合は、ツイストは、「未処理のエラー」に記録されたエラーにつながります。
DeferredListは、並列組み合わせ一緒にいくつかの非同期演算結果の一般的な使用です。すべての操作が成功した場合は失敗した一つの操作があれば、それは、成功して動作することができ、その後、操作は失敗します。twisted.internet.defer.gatherResultsショートカットです:

from twisted.internet import defer
d1 = defer.Deferred()
d2 = defer.Deferred()
d = defer.gatherResults([d1, d2], consumeErrors=True)
 
def cbPrintResult(result):
  print(result)
 
d.addCallback(cbPrintResult)
 
d1.callback("one")
# nothing is printed yet; d is still awaiting completion of d2
d2.callback("two")
# printResult prints ["one", "two"]

繰延のチェーン
あなたが別の繰延オブジェクトを実行するために繰延オブジェクトを待つ必要がある場合は、あなたがしなければならないがチェーンでのコールバック関数コールバック関数から繰延オブジェクトを返します。あなたは繰延コールバックオブジェクトAから繰延オブジェクトBを返す場合は、特定の時点では、その後、コールバック関数チェーンは)(コールバックBに関数呼び出しの前に待機します。この場合、最初のコールバック関数パラメータA、Bは、最後のコールバック関数が結果を返しています。
場合、そのメモDeferredオブジェクトは、そのコールバック関数内で直接または間接的にそれ自体に戻され、そのような挙動が定義されていません。この状況を検出し、警告を与えるために、コードの試み。将来的には、直接のスローを有することができます。
これは少し複雑なようであれば、心配はありません-あなたはこのような状況が発生したとき、あなたは認識可能性があり、それが直接、このような結果を生む理由を知っています。手動繰延オブジェクトを配置する必要がある場合は
リンクされている、便利な方法があります:chainDeferred(otherDeferred)
良いパイソンの収集を推奨する口の中の最後の言葉は、[ 入力する]をクリック ]、古いタイマー、面接のスキルを、スキルを学習経験を学習の多くは、職場があります株式の経験など、より多くの我々は慎重にゼロベースの入門情報、実際のプロジェクトに関する情報を準備し、タイミングが毎日Pythonプログラマの技術を説明するために持っている、いくつかの学習方法を共有し、小型の詳細に注意を払うに必要
要約
解決に私たちを助けるためにどのように延期私たちが認識これらの問題は以下のとおりです。
私たちはエラーバック、APIの必要性、それのいずれかで非同期プログラミングを無視することはできません。繰延サポートerrbacks。
アクティブコールバック時間が非常に深刻な問題につながる可能性があります。据え置きのみ以外/プログラミング試みを同期させる処理方法と同様であり、一度活性化することができます。
プログラムは、再構成時にかなり困難コールバックが含まれています。延期により、我々は、コールバック・チェーンを変更することによって、プログラムを再構築する必要があります。

公開された10元の記事 ウォンの賞賛0 ビュー3946

おすすめ

転載: blog.csdn.net/haoxun11/article/details/104886615