2016-07-05 6 views
3

私はasyncioに非常に新しく、より良いプラクティス、プロトコル、またはストリームという点で、どのAPIが他のAPIより優れているのだろうかと疑問に思っていましたか?asyncioでプロトコルまたはストリームを使用する必要がありますか?

私には、すでにconnection_madedata_receivedメソッドが提供されているので、私にはprotocol(callback based API)が使いやすいようです。 streams(coroutine based API)を使用すると、接続を管理してデータを自分で読み取る必要がありますが、それはcoroutineのコンセプトを利用しているような気がします。

これは受信データを聞く方法であり、私にとっては気分が悪いです。 readeexactlyも使用できますが、時にはIncompleteReadErrorが発生します。

message_body = b'' 
message_length = SOME_NUMBER 
while True: 
    while len(message_body) < message_length: 
     try: 
      message_body_chunk = await reader.read(message_length - len(message_body)) 
     except Exception as e: 
      self.logger.error(e) 
      return 
      if not message_body_chunk: 
       return 
      message_body += message_body_chunk 

答えて

3

stream objectsは、より高いレベルであり、多くの有用な方法を提供します。EOFに達した場合reader.read, readline, readuntil, readexactly

  • チェック:reader.ateof
  • コントロールライトの流れを:writer.drainデータを読み込むため

    • いくつかの方法を

    Liいずれの抽象化でも、これはコストがかかります:コルーチンはコールバックより少し反応が遅いです。

    • いくつかのデータが受信されると、コールバックがトリガされるとreader.feed_dataが呼び出される:例えばreader.read()は、少なくとも2つのイベントループコールバックを含みます。
    • feed_dataは、reader.read()の実行を復元する別のコールバックをトリガーします。
  • 関連する問題