当前位置: 代码迷 >> python >> 套接字是否应该非阻塞才能在Python中与select一起使用?
  详细解决方案

套接字是否应该非阻塞才能在Python中与select一起使用?

热度:61   发布时间:2023-06-21 10:52:37.0
  1. 与Python中的一起使用时,套接字应该设置为非阻塞状态吗?
  2. 不管是不是,这有什么区别?

有时,我发现在返回sendable的套接字上调用会阻塞。 此外,我发现套接字通常会发送给定的整个缓冲区(128 KiB)。 在非阻塞模式下,发送将接受的字节要少得多(与之前的示例相比为20-40 KiB),并且返回速度更快。 我使用 。

不幸的是,答案可能取决于操作系统。 我只回答关于Linux的问题。

我不了解select中关于阻塞/非阻塞套接字的区别,但是在linux上, select系统调用手册页的“ BUGS”部分中包含以下内容:

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

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

至于阻止写入发送更多数据,这是可以预期的。 如果套接字正在阻塞,则send将一直阻塞,直到有足够的缓冲区空间将整个请求向下传递为止。 如果套接字是非阻塞的,则它只会发送套接字当前可容纳的发送缓冲区。

  相关解决方案