【发布时间】:2018-11-28 11:37:37
【问题描述】:
我正在尝试使用 python asyncio 进行一些实验以改进该领域,出于自学目的,我正在尝试连接到 redis,发送一些命令并读取响应,这可能属于通用的“读取流”来自某个来源的数据”。我无法解决的问题是如何分块读取数据,因为服务器和客户端之间的连接没有关闭,并且终止序列\r\n 可能会多次遇到。如果我在没有更多数据时等待,那么调用当然会阻塞,直到收到其他数据。
class Client:
def __init__(self, loop, host='127.0.0.1', port=6379):
self.host = host
self.port = port
self.reader = None
self.writer = None
self.loop = loop
@asyncio.coroutine
def _connect(self):
self.reader, self.writer = yield from asyncio.open_connection(
self.host, self.port, loop=self.loop)
async def read(self, b=4096):
resp = b''
while True:
chunk = await self.reader.read(b)
if chunk:
resp += chunk
else:
break
return resp
假设我想以 2 个字节为单位读取响应(是的,这很愚蠢,但这只是为了学习目的)所以:
loop = asyncio.get_event_loop()
client = Client(loop)
..... sends some commands here ....
resp = await client.read(2)
我不知道在不知道服务器响应长度的情况下,当响应长于从套接字读取的字节时,代码仍然是安全的。
【问题讨论】:
-
readuntil 似乎可以完成这项工作,但仍然不适合想要完全控制块大小的情况
-
将终止顺序更改为仅在终止时使用的内容。
-
我无法更改服务器响应我的方式
-
如何在响应中多次出现终止序列? 终止序列的定义不是终止响应吗?你能展示你如何使用普通的阻塞套接字来实现你所需要的吗?
标签: python python-3.x python-asyncio python-sockets