ストリームから降伏する正しい方法は何ですか?

ザックゲイツ:

私が持っているConnectionの読み取りと書き込みの流れ含むために使用されているオブジェクトasyncioの接続を:

class Connection(object):

    def __init__(self, stream_in, stream_out):
        object.__init__(self)

        self.__in = stream_in
        self.__out = stream_out

    def read(self, n_bytes : int = -1):
        return self.__in.read(n_bytes)

    def write(self, bytes_ : bytes):
        self.__out.write(bytes_)
        yield from self.__out.drain()

サーバー側でconnectedConnection、クライアントが接続するたびにオブジェクトを作成し、4バイトを読み取ります。

@asyncio.coroutine
def new_conection(stream_in, stream_out):
    conn = Connection(stream_in, stream_out)
    data = yield from conn.read(4)
    print(data)

クライアント側では、4バイトが書き出されます。

@asyncio.coroutine
def client(loop):
    ...
    conn = Connection(stream_in, stream_out)
    yield from conn.write(b'test')

これはほぼ期待どおりに動作しますが、私はyield fromすべてreadwrite呼び出しなければなりません私はyield from内側から試してみましたConnection

def read(self, n_bytes : int = -1):
    data = yield from self.__in.read(n_bytes)
    return data

しかし、データを取得するのではなく、次のような出力を取得します

<generator object StreamReader.read at 0x1109983b8>

I呼び出した場合readと、write複数の場所から、私は繰り返さない希望yield fromするたびにね。むしろそれらを内部に保管しますConnection私の最終的な目標は、私のnew_conection機能をこれに切り詰めることです

@asyncio.coroutine
def new_conection(stream_in, stream_out):
    conn = Connection(stream_in, stream_out)
    print(conn.read(4))
user2508324:

のでStreamReader.readコルーチンで、それを呼び出すためのあなたの唯一のオプションである)でラップTaskたりFutureとイベントループ、B)を経由していることを実行しているawaitと定義されたコルーチンからそれをINGのasync def使用、またはc)yield from関数として定義コルーチンからそれで飾らと@asyncio.coroutine

Connection.readは(コルーチンを介してnew_connectionイベントループから呼び出されるため、そのイベントループを再利用してa TaskまたはFuturefor StreamReader.readイベントループを実行することはできませんイベントループ停止する(悲惨で、おそらく正しく実行できない可能性があります)、または新しいイベントループを作成する必要があります(面倒で、コルーチンの使用目的を無効にする)。これらはどちらも望ましいものではないためConnection.read、コルーチンまたはasync関数である必要があります。

(他の2つのオプションawaitasync defコルーチン又はyield fromにおける@asyncio.coroutine-decorated機能)はほとんど同等です。唯一の違いは、async defawaitはPython 3.5追加されたことです。したがって、3.4では、yield from@asyncio.coroutineが唯一のオプションです(コルーチンとasyncio3.4より前には存在しなかったため、他のバージョンは関係ありません)。個人的に、私が使用して好むasync defawaitでコルーチンを定義するので、async defクリーナーやデコレータとより明確です。

簡単に言うConnection.readnew_connection、コデインを持ち、デコレーターまたはasyncキーワードを使用してコルーチンになり他のコルーチンを呼び出すときにawait(またはyield fromを使用しますawait conn.read(4)in new_connection、およびawait self.__in.read(n_bytes)in Connection.read)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

リストビューからデータを保存する正しい方法は何ですか?

分類Dev

Linq-IQueryable式のリストからユーザーを除外する-正しい方法は何ですか?

分類Dev

Firebaseからリストにデータを入力する正しい方法は何ですか?

分類Dev

別のストリームが完了した後に値を出力する正しい方法は何ですか?

分類Dev

AngularからNodejs APIにHTTPリクエストを送信する正しい方法は何ですか?

分類Dev

Pythonでリストを再割り当てする正しい方法は何ですか?

分類Dev

リクエストのIPを取得する正しい方法は何ですか

分類Dev

GSLマトリックスを解放する正しい方法は何ですか?

分類Dev

POSTリクエストを処理する正しい方法は何ですか

分類Dev

MySQLにリストを保存する正しい方法は何ですか?

分類Dev

UIStoryboard:アクティブなストーリーボードを取得する正しい方法は何ですか?

分類Dev

Rustで複数のリンクリストを作成し、それらの間でデータを移動する正しい方法は何ですか?

分類Dev

パラメータで置き換えるストリームの正しい用語は何ですか?

分類Dev

ゲームでマウスを動かす正しい方法は何ですか?

分類Dev

symfonyアプリにブートストラップを追加する正しい方法は何ですか?

分類Dev

リスト要素を閉じる正しい方法は何ですか?

分類Dev

TypeScriptでchaiを使用してBLOB(mimeタイプのオクテットストリーム)を処理する正しい方法は何ですか?

分類Dev

スクリーンリーダーにスパンテキストを読み取らせる正しい方法は何ですか

分類Dev

リアクティブフォームのFormGroupにカスタムコンポーネントを追加する正しい方法は何ですか?

分類Dev

JSON.NETを使用してJSONオブジェクトのストリームを解析する正しい方法は何ですか?

分類Dev

Android用のCarbonライブラリをインストールする正しい方法は何ですか?

分類Dev

AjaxリクエストにAuthorizationヘッダーを添付する正しい方法は何ですか?

分類Dev

Flurlを使用してストリーム応答をファイルに投稿および保存する正しい方法は何ですか

分類Dev

pysparkのリスト内のさまざまなデータフレーム列を合計する正しい方法は何ですか?

分類Dev

関数から戻る正しい方法は何ですか?

分類Dev

postgres DBからelasticsearchにテーブルをsnyc /インポートする正しい方法は何ですか?

分類Dev

ストリッピング後にhgリポジトリからファイルを削除する正しい方法は何ですか?

分類Dev

Springでリストを返す正しい方法は何ですか

分類Dev

タイムアウトをリセットする正しい方法は何ですか?

Related 関連記事

  1. 1

    リストビューからデータを保存する正しい方法は何ですか?

  2. 2

    Linq-IQueryable式のリストからユーザーを除外する-正しい方法は何ですか?

  3. 3

    Firebaseからリストにデータを入力する正しい方法は何ですか?

  4. 4

    別のストリームが完了した後に値を出力する正しい方法は何ですか?

  5. 5

    AngularからNodejs APIにHTTPリクエストを送信する正しい方法は何ですか?

  6. 6

    Pythonでリストを再割り当てする正しい方法は何ですか?

  7. 7

    リクエストのIPを取得する正しい方法は何ですか

  8. 8

    GSLマトリックスを解放する正しい方法は何ですか?

  9. 9

    POSTリクエストを処理する正しい方法は何ですか

  10. 10

    MySQLにリストを保存する正しい方法は何ですか?

  11. 11

    UIStoryboard:アクティブなストーリーボードを取得する正しい方法は何ですか?

  12. 12

    Rustで複数のリンクリストを作成し、それらの間でデータを移動する正しい方法は何ですか?

  13. 13

    パラメータで置き換えるストリームの正しい用語は何ですか?

  14. 14

    ゲームでマウスを動かす正しい方法は何ですか?

  15. 15

    symfonyアプリにブートストラップを追加する正しい方法は何ですか?

  16. 16

    リスト要素を閉じる正しい方法は何ですか?

  17. 17

    TypeScriptでchaiを使用してBLOB(mimeタイプのオクテットストリーム)を処理する正しい方法は何ですか?

  18. 18

    スクリーンリーダーにスパンテキストを読み取らせる正しい方法は何ですか

  19. 19

    リアクティブフォームのFormGroupにカスタムコンポーネントを追加する正しい方法は何ですか?

  20. 20

    JSON.NETを使用してJSONオブジェクトのストリームを解析する正しい方法は何ですか?

  21. 21

    Android用のCarbonライブラリをインストールする正しい方法は何ですか?

  22. 22

    AjaxリクエストにAuthorizationヘッダーを添付する正しい方法は何ですか?

  23. 23

    Flurlを使用してストリーム応答をファイルに投稿および保存する正しい方法は何ですか

  24. 24

    pysparkのリスト内のさまざまなデータフレーム列を合計する正しい方法は何ですか?

  25. 25

    関数から戻る正しい方法は何ですか?

  26. 26

    postgres DBからelasticsearchにテーブルをsnyc /インポートする正しい方法は何ですか?

  27. 27

    ストリッピング後にhgリポジトリからファイルを削除する正しい方法は何ですか?

  28. 28

    Springでリストを返す正しい方法は何ですか

  29. 29

    タイムアウトをリセットする正しい方法は何ですか?

ホットタグ

アーカイブ