Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么asyncio.StreamReader.read返回不';你不堵线吗?_Python_Python 3.6_Python Asyncio - Fatal编程技术网

Python 为什么asyncio.StreamReader.read返回不';你不堵线吗?

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函数没有被阻止呢? 这是否意味着

我尝试运行这个异步IO示例

这句话让我感到困惑:

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。服务器的会话将被阻止,直到它收到指定的长度。