select.select
时,套接字是否应设置为非阻塞?偶尔我发现在返回sendable的套接字上调用send
会阻塞。此外,我发现blocking套接字通常会发送给定的整个缓冲区(128 KiB)。在非阻塞模式下,发送将接受更少的字节(与前面给出的示例相比为20-40 KiB)并且返回更快。我正在使用Python 3.1 on Lucid。
答案 0 :(得分:5)
不幸的是,答案可能依赖于操作系统。我只回复Linux。
我不知道select中有关阻塞/非阻塞套接字的区别,但在linux上,select
系统调用手册页中有“BUGS”部分:
在Linux下,select()可能会报告 套接字文件描述符为“准备好了 阅读“,尽管如此 后续读取块。这可以 例如,数据发生时 到了但经过检查已经到了 错误的校验和并被丢弃。可能还有其他的 文件的情况 描述符被虚假报告为 准备。因此,使用起来可能更安全 套接字上的O_NONBLOCK不应该 块。
我怀疑上面的python抽象可以“隐藏”这个问题而没有副作用。
至于阻塞写入发送更多数据,这是预期的。如果套接字阻塞,send
将阻塞,直到有足够的缓冲区空间来传递整个请求。如果套接字是非阻塞的,它只会发送当前适合套接字发送缓冲区的数量。