xmpppy。文件描述符超出选择范围

Posted

技术标签:

【中文标题】xmpppy。文件描述符超出选择范围【英文标题】:xmpppy. filedescriptor out of range in select 【发布时间】:2012-04-09 07:18:44 【问题描述】:

我正在使用 xmpppy。我创建了 50 多个 xmpp 连接线程。一段时间后我得到一个错误:

File "transports.py", line 199, in pending_data return select.select([self._sock],[],[],timeout)[0] ValueError: filedescriptor out of range in select()

为什么会这样?

附:对不起我的语言。

【问题讨论】:

这有时可能表明您的文件描述符用完了,如果您没有正确关闭文件/连接,这在多线程环境中很容易发生。在 Linux 下,您可以通过查看 /proc/<pid>/fd/ 来查看应用程序(在运行时)的打开文件列表,其中 <pid> 是程序的进程 ID。如果这很大(接近 1024),您可能 (a) 代码有问题或 (b) 需要增加程序的打开文件限制。 【参考方案1】:

xmpppy 使用select() 系统调用来监控打开的连接。不幸的是 select() 有一个非常尴尬的限制 - 在大多数系统上,它只能监视文件描述符数达到一定限制的连接,通常是 1024。

这意味着随着您打开更多文件和连接,最终您将达到限制。

解决方案是让 xmpppy 使用 poll() 或更现代(但特定于操作系统)的 API,例如 epoll 或 kqueue。所有这些都可以通过 Python 的'select' module 访问。

【讨论】:

以上是关于xmpppy。文件描述符超出选择范围的主要内容,如果未能解决你的问题,请参考以下文章

Nebula系列通过UNIX域套接字传递描述符的应用

Linux进程数,句柄数,文件描述符是什么

Linux系统编程:基本 I/O 系统调用

IO相关操作

c++和opencv中的向量下标超出范围错误

列出一些数据集的索引超出范围?