问题描述
- 与Python中的一起使用时,套接字应该设置为非阻塞状态吗?
- 不管是不是,这有什么区别?
有时,我发现在返回sendable的套接字上调用会阻塞。 此外,我发现套接字通常会发送给定的整个缓冲区(128 KiB)。 在非阻塞模式下,发送将接受的字节要少得多(与之前的示例相比为20-40 KiB),并且返回速度更快。 我使用 。
1楼
不幸的是,答案可能取决于操作系统。 我只回答关于Linux的问题。
我不了解select中关于阻塞/非阻塞套接字的区别,但是在linux上, select
系统调用手册页的“ BUGS”部分中包含以下内容:
在Linux下,select()可能会将套接字文件描述符报告为“准备读取”,但是随后的读取会阻塞。 例如,这可能在数据到达但检查时校验和错误并被丢弃时发生。 在其他情况下,文件描述符可能会虚假地报告为就绪。 因此,在不应阻塞的套接字上使用O_NONBLOCK可能更安全。
我怀疑上面的python抽象能否“隐藏”这个问题而没有副作用。
至于阻止写入发送更多数据,这是可以预期的。
如果套接字正在阻塞,则send
将一直阻塞,直到有足够的缓冲区空间将整个请求向下传递为止。
如果套接字是非阻塞的,则它只会发送套接字当前可容纳的发送缓冲区。