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

时间:2011-03-08 20:09:39

标签: python sockets select python-3.x blocking

  1. 在Python中使用select.select时,套接字是否应设置为非阻塞?
  2. 如果它们有或没有什么区别?
  3. 偶尔我发现在返回sendable的套接字上调用send会阻塞。此外,我发现blocking套接字通常会发送给定的整个缓冲区(128 KiB)。在非阻塞模式下,发送将接受更少的字节(与前面给出的示例相比为20-40 KiB)并且返回更快。我正在使用Python 3.1 on Lucid

1 个答案:

答案 0 :(得分:5)

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

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

  

在Linux下,select()可能会报告   套接字文件描述符为“准备好了   阅读“,尽管如此   后续读取块。这可以   例如,数据发生时   到了但经过检查已经到了          错误的校验和并被丢弃。可能还有其他的   文件的情况   描述符被虚假报告为   准备。因此,使用起来可能更安全   套接字上的O_NONBLOCK不应该   块。

我怀疑上面的python抽象可以“隐藏”这个问题而没有副作用。

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