私が持っている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()
サーバー側でconnected
はConnection
、クライアントが接続するたびにオブジェクトを作成し、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
すべてread
をwrite
呼び出しなければなりません。私は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))
のでStreamReader.read
コルーチンで、それを呼び出すためのあなたの唯一のオプションである)でラップTask
たりFuture
とイベントループ、B)を経由していることを実行しているawait
と定義されたコルーチンからそれをINGのasync def
使用、またはc)yield from
関数として定義コルーチンからそれで飾らと@asyncio.coroutine
。
Connection.read
は(コルーチンを介してnew_connection
)イベントループから呼び出されるため、そのイベントループを再利用してa Task
またはFuture
for StreamReader.read
:イベントループを実行することはできません。イベントループを停止するか(悲惨で、おそらく正しく実行できない可能性があります)、または新しいイベントループを作成する必要があります(面倒で、コルーチンの使用目的を無効にする)。これらはどちらも望ましいものではないためConnection.read
、コルーチンまたはasync
関数である必要があります。
(他の2つのオプションawait
でasync def
コルーチン又はyield from
における@asyncio.coroutine
-decorated機能)はほとんど同等です。唯一の違いは、async def
とawait
はPython 3.5で追加されたことです。したがって、3.4では、yield from
と@asyncio.coroutine
が唯一のオプションです(コルーチンとasyncio
3.4より前には存在しなかったため、他のバージョンは関係ありません)。個人的に、私が使用して好むasync def
とawait
でコルーチンを定義するので、async def
クリーナーやデコレータとより明確です。
簡単に言うConnection.read
とnew_connection
、コデインを持ち、デコレーターまたはasync
キーワードを使用してコルーチンになり、他のコルーチンを呼び出すときにawait
(またはyield from
)を使用します(await conn.read(4)
in new_connection
、およびawait self.__in.read(n_bytes)
in Connection.read
)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加