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

发布于 2024-10-21 04:41:00 字数 651 浏览 1 评论 0原文

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

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

  1. Should sockets be set to non-blocking when used with select.select in Python?
  2. What difference does it make if they are or aren't?

Occasionally I find that calling send on a socket that returns sendable will block. Furthermore I find that blocking sockets will generally send the whole buffer given (128 KiB). In non-blocking mode, sending will accept far fewer bytes (20-40 KiB compared with the example given earlier) and return quicker. I'm using Python 3.1 on Lucid.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我不会写诗 2024-10-28 04:41:00

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

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

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

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

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

The answer might be OS dependent unfortunately. I'm replying only regarding Linux.

I'm not aware of differences regarding blocking/non-blocking sockets in select, but on linux, the select system call man page has this in it 'BUGS' section:

Under Linux, select() may report a
socket file descriptor as "ready for
reading", while nevertheless a
subsequent read blocks. This could
for example happen when data has
arrived but upon examination has
wrong checksum and is discarded. There may be other
circumstances in which a file
descriptor is spuriously reported as
ready. Thus it may be safer to use
O_NONBLOCK on sockets that should not
block.

I doubt a python abstraction above that could "hide" this issue without side-effects.

As for the blocking write sending more data, that's expected. send will block until there is enough buffer space to pass your whole request down if the socket is blocking. If the socket is non-blocking, it only sends as much as can currently fit in the socket's send buffer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文