Tôi có một đối tượng Connection
được sử dụng để chứa đọc và viết dòng asyncio
kết nối:Cách chính xác để thu được từ luồng là gì?
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()
Về phía server, connected
tạo ra một đối tượng Connection
mỗi khi một client kết nối, sau đó đọc 4 byte.
@asyncio.coroutine
def new_conection(stream_in, stream_out):
conn = Connection(stream_in, stream_out)
data = yield from conn.read(4)
print(data)
Và ở phía máy khách, 4 byte được viết ra.
@asyncio.coroutine
def client(loop):
...
conn = Connection(stream_in, stream_out)
yield from conn.write(b'test')
này làm việc gần như như mong đợi, nhưng tôi phải yield from
mỗi read
và write
gọi. Tôi đã thử yield from
ing từ bên Connection
:
def read(self, n_bytes : int = -1):
data = yield from self.__in.read(n_bytes)
return data
Nhưng thay vì nhận được dữ liệu, tôi nhận được một kết quả như
<generator object StreamReader.read at 0x1109983b8>
Nếu tôi gọi read
và write
từ nhiều nơi, tôi không muốn lặp lại mỗi lần yield from
; thay vì giữ chúng bên trong Connection
. Mục tiêu cuối cùng của tôi là cắt giảm chức năng new_conection
của tôi như thế này:
@asyncio.coroutine
def new_conection(stream_in, stream_out):
conn = Connection(stream_in, stream_out)
print(conn.read(4))
Tại sao bạn phải sinh lời? Nếu bạn không kiếm được từ conn.read (4), có vẻ như tôi chỉ đơn giản trả về một đối tượng byte. Đó là những gì bạn đang tìm kiếm ở đây? – RageCage
@RageCage: Không có 'yield from'ing,' conn.read (4) 'vẫn trả về một trình tạo:' ' –
Xin lỗi tôi nên làm rõ; nếu bạn không thu được từ lần lặp đầu tiên của conn.read() (phiên bản dòng đơn) kết quả là gì? – RageCage