1 回答

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
write_eof()
如果您想在每次請(qǐng)求后關(guān)閉套接字,則需要使用
緩沖的寫(xiě)入數(shù)據(jù)刷新后,關(guān)閉流的寫(xiě)入端。
您的代碼稍加修改將如下所示:
async def handle_req(self, reader, writer):
? ? await reader.readline()
? ? writer.write(b"$3\r\nbaz\r\n")
? ? await writer.drain()
? ? writer.write_eof()
? ? writer.close()
? ? await writer.wait_closed()
通常,您不會(huì)在每次請(qǐng)求后關(guān)閉套接字。
以下示例僅用于說(shuō)明目的,旨在表明套接字不需要關(guān)閉。當(dāng)然,您總是會(huì)讀取一行,然后根據(jù) Redis 協(xié)議解釋數(shù)據(jù)。我們知道這里發(fā)送了兩個(gè) GET 命令(每行 5 行,包含 2 個(gè)元素的數(shù)組的指示符,字符串的指示符,字符串值“GET”,以及字符串指示符和相應(yīng)的值,即鍵)
async def handle_req(self, reader, writer):
? ? print("start")
? ? for i in range(0, 2):
? ? ? ? for x in range(0, 5):
? ? ? ? ? ? print(await reader.readline())
? ? ? ? writer.write(b"$3\r\nbaz\r\n")
? ? ? ? await writer.drain()
? ? writer.write_eof()
? ? writer.close()
? ? await writer.wait_closed()
在客戶端發(fā)送是這樣完成的:
print(r.get("foo"))
print(r.get("bar"))
time.sleep(1)
最后一次time.sleep是為了確??蛻舳瞬粫?huì)立即退出。
控制臺(tái)上的輸出是:
start
b'*2\r\n'
b'$3\r\n'
b'GET\r\n'
b'$3\r\n'
b'foo\r\n'
b'*2\r\n'
b'$3\r\n'
b'GET\r\n'
b'$3\r\n'
b'bar\r\n'
請(qǐng)注意,start僅輸出一次,這表明我們可以處理多個(gè)請(qǐng)求,而不必立即關(guān)閉套接字。
添加回答
舉報(bào)