【问题标题】:Should sockets be non-blocking to work with select in Python?套接字应该是非阻塞的以在 Python 中使用 select 吗?
【发布时间】:2011-07-11 09:34:06
【问题描述】:
  1. 在 Python 中与 select.select 一起使用时,是否应将套接字设置为非阻塞?
  2. 它们是或不是有什么区别?

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

【问题讨论】:

  • 你不是说“在返回可读的套接字上调用recv”吗?

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


【解决方案1】:

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

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

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

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

至于阻塞写入发送更多数据,这是意料之中的。如果套接字阻塞,send 将阻塞直到有足够的缓冲区空间来传递您的整个请求。如果套接字是非阻塞的,它只会发送当前可以容纳在套接字发送缓冲区中的数量。

【讨论】:

  • 一个绝妙的答案。正是我想要的。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多