我有用於包含讀和寫的asyncio
連接流的Connection
對象:從流中產生的正確方法是什麼?
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>
如果我打電話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))
爲什麼你必須屈服?如果你不從conn.read(4)產生,它在我看來就像它只是返回一個字節對象。這是你在這裏尋找什麼? – RageCage
@RageCage:如果沒有''yield'',conn.read(4)'仍然返回一個生成器:'<生成器對象Connection.read at 0x1019262b0>' –
對不起,我應該澄清;如果你不從conn.read()(單行版本)的第一次迭代中產生什麼結果? – RageCage