套接字是否应该是非阻塞的,以便在Python中使用select?

Mat*_*ner 5 python sockets select blocking python-3.x

  1. select.select在Python中使用时,套接字是否应设置为非阻塞?
  2. 它们有或没有什么区别?

偶尔我发现调用send一个返回sendable的套接字会阻塞.此外,我发现阻塞套接字通常会发送给定的整个缓冲区(128 KiB).在非阻塞模式下,发送将接受更少的字节(与前面给出的示例相比为20-40 KiB)并且返回更快.我在Lucid上使用Python 3.1.

Mat*_*Mat 5

不幸的是,答案可能依赖于操作系统.我只回复Linux.

我不知道select中有关阻塞/非阻塞套接字的区别,但在linux上,select系统调用手册页中有"BUGS"部分:

在Linux下,select()可以将套接字文件描述符报告为"准备好读取",而不是后续的读取块.这可能例如在数据到达时发生但在检查时具有错误的校验和并被丢弃.可能存在其他情况,其中虚假地报告文件描述符为就绪.因此,在不应阻塞的套接字上使用O_NONBLOCK可能更安全.

我怀疑上面的python抽象可以"隐藏"这个没有副作用的问题.

至于阻塞写入发送更多数据,这是预期的.send如果套接字阻塞,将阻塞,直到有足够的缓冲区空间来传递整个请求.如果套接字是非阻塞的,它只会发送当前适合套接字发送缓冲区的数量.