Mam Connection
obiekt, który jest używany do przechowywania odczytu i zapisu strumieni asyncio
połączeń:Jaki jest prawidłowy sposób uzyskiwania ze strumienia?
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()
Po stronie serwera, connected
tworzy Connection
obiektowi każdym razem, gdy klient łączy się, a następnie czyta 4 bajty.
@asyncio.coroutine
def new_conection(stream_in, stream_out):
conn = Connection(stream_in, stream_out)
data = yield from conn.read(4)
print(data)
Po stronie klienta wypisane są 4 bajty.
@asyncio.coroutine
def client(loop):
...
conn = Connection(stream_in, stream_out)
yield from conn.write(b'test')
to działa prawie jak oczekiwano, ale muszę yield from
każdy read
i write
rozmowy. Próbowałem yield from
ing od wewnątrz Connection
:
def read(self, n_bytes : int = -1):
data = yield from self.__in.read(n_bytes)
return data
Ale zamiast pobierania danych, mam wyjścia jak
<generator object StreamReader.read at 0x1109983b8>
Jeśli zadzwonię read
i write
z wielu miejsc, bym nie preferowała powtórz yield from
s za każdym razem; raczej trzymanie ich wewnątrz Connection
. Moje ostatecznym celem jest wyciąć mój new_conection
funkcji to:
@asyncio.coroutine
def new_conection(stream_in, stream_out):
conn = Connection(stream_in, stream_out)
print(conn.read(4))
Dlaczego musisz ustąpić? Jeśli nie zrezygnujesz z conn.read (4), wygląda na to, że po prostu zwraca obiekt bajtów. Czy tego właśnie szukasz? – RageCage
@RageCage: Bez 'yield from'ing,' conn.read (4) 'nadal zwraca generator:' ' –
Przepraszam, że powinienem był wyjaśnić; jeśli nie zrezygnujesz z pierwszej iteracji conn.read() (wersja z pojedynczą linią), jaki jest wynik? – RageCage