1 回答

TA貢獻1995條經驗 獲得超2個贊
write_eof()
如果您想在每次請求后關閉套接字,則需要使用
緩沖的寫入數據刷新后,關閉流的寫入端。
您的代碼稍加修改將如下所示:
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()
通常,您不會在每次請求后關閉套接字。
以下示例僅用于說明目的,旨在表明套接字不需要關閉。當然,您總是會讀取一行,然后根據 Redis 協議解釋數據。我們知道這里發送了兩個 GET 命令(每行 5 行,包含 2 個元素的數組的指示符,字符串的指示符,字符串值“GET”,以及字符串指示符和相應的值,即鍵)
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()
在客戶端發送是這樣完成的:
print(r.get("foo"))
print(r.get("bar"))
time.sleep(1)
最后一次time.sleep是為了確??蛻舳瞬粫⒓赐顺?。
控制臺上的輸出是:
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'
請注意,start僅輸出一次,這表明我們可以處理多個請求,而不必立即關閉套接字。
添加回答
舉報