Python 为什么asyncio.StreamReader.read返回不';你不堵线吗?
我尝试运行这个异步IO示例 这句话让我感到困惑:Python 为什么asyncio.StreamReader.read返回不';你不堵线吗?,python,python-3.6,python-asyncio,Python,Python 3.6,Python Asyncio,我尝试运行这个异步IO示例 这句话让我感到困惑: data = yield from reader.read(100) # data -> b'Hello World!' 客户端发送字符串“你好,世界!”到服务器,字节数组长度小于100 协同路由读取(n=-1)最多读取n个字节。如果未提供或设置n 到-1,读取到EOF并返回所有读取字节 如果接收到EOF且内部缓冲区为空,则返回 空字节对象 此方法是一个协同程序 我没有在客户端发送EOF,那么为什么read函数没有被阻止呢? 这是否意味着
data = yield from reader.read(100) # data -> b'Hello World!'
客户端发送字符串“你好,世界!”到服务器,字节数组
长度小于100
协同路由读取(n=-1)最多读取n个字节。如果未提供或设置n
到-1,读取到EOF并返回所有读取字节
如果接收到EOF且内部缓冲区为空,则返回
空字节对象
此方法是一个协同程序
我没有在客户端发送EOF
,那么为什么read
函数没有被阻止呢?
这是否意味着Bytearray
在string.encode
之后包含EOF
我没有在客户端发送EOF,那么为什么读取函数没有被阻止呢
因为收到了一些数据,read
提供了它。您引用的文档明确指出,read(n)
读取“最多n字节”。这是一个特性:如果read(n)
仅在完整的n字节可用时返回,它将引入echo服务器,在读取完整字节之前,echo服务器不会回显任何内容。有了这样的语义,使echo服务器没有缓冲区引起的延迟的唯一方法是使用read(1)
逐字节读取数据,这将是非常低效的
echo服务器使用的read(n)
的预期含义是“在数据可用时立即提供给我,但每次不超过n个字节”。必须提供一个限制,不是因为它一定有意义,而是为了防止恶意对等方通过发送大量数据来淹没您的内存
注意,通过这样指定read()
,很容易定义另一个函数来读取数据,直到精确的量可用为止;事实上,StreamReader
上已经存在这样的方法:
这是否意味着Bytearray在string.encode之后包含EOF
read
返回的对象(与对象不同)从不“包含EOF”,因为EOF不是字符,它是带外信号的条件。在StreamReader
API中,EOF条件由read
返回一个空字节对象来指示。您是否检查了return
和yield
之间的差异?对不起,return
这个词,我指的是read
函数执行的返回值(该值来自read函数内部的yield)。我不太明白你的回答,如果可以的话,请重新表述。无论如何,我的评论是建议收益率
和收益率
之间存在差异,这可能是你困惑的根源。另外,如果Bytearray小于100,为什么你会期望它返回更多呢d这不是你的EOF?@MikeMajara我希望服务器不会收到任何东西,因为Bytearray不包含EOF
,并且长度小于100。服务器的会话将被阻止,直到它收到指定的长度。