首页后端开发Pythonrecv是阻塞还是非阻塞的

recv是阻塞还是非阻塞的

时间2023-06-05 16:55:02发布访客分类Python浏览449
导读:recv是阻塞还是非阻塞的?socket分为阻塞和非阻塞两种,可以通过setsockopt,或者更简单的setblocking, settimeout设置。阻塞式的socket的recv服从这样的规则:当缓冲区内有数据时,立即返回所有的数据...

recv是阻塞还是非阻塞的?

socket分为阻塞和非阻塞两种,可以通过setsockopt,或者更简单的setblocking, settimeout设置。

阻塞式的socket的recv服从这样的规则:当缓冲区内有数据时,立即返回所有的数据;当缓冲区内无数据时,阻塞直到缓冲区中有数据。

非阻塞式的socket的recv服从的规则则是:当缓冲区内有数据时,立即返回所有的数据;当缓冲区内无数据时,产生EAGAIN的错误并返回(在Python中会抛出一个异常)。

两种情况都不会返回空字符串,返回空数据的结果是对方关闭了连接之后才会出现的。由于TCP的socket是一个流,因此是不存在“读完了对方发送来的数据”这件事的。

你必须要每次读到数据之后,根据数据本身来判断当前需要等待的数据是否已经全部收到,来判断是否进行下一个recv。

可以看一下hiredis库的接口设计,hiredis中的Reader有两个接口,分别是feed和gets,feed每次送入一部分数据,不需要保证是正确分片的;gets则返回已经得到的完整的结果,如果返回False,表示已经没有新的结果。基本上所有的TCP的socket编程都是遵循这样的方法:读入新数据;判断有没有完整的新消息;处理新消息,或者等待更多数据。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: recv是阻塞还是非阻塞的
本文地址: https://pptw.com/jishu/62788.html
为什么输出中既有单引号又有双引号 现在开始发奋读书改变命运和家人生活还来得及吗

游客 回复需填写必要信息