如何编译支持 >1024 文件描述符的 Python?

1 投票
1 回答
2068 浏览
提问于 2025-04-17 01:38

解决 supervisord 中一个问题的办法是:“编译一个支持超过 1024 个文件描述符的 Python”。

https://github.com/Supervisor/supervisor/issues/26

有人能帮我详细讲讲需要做哪些更改才能实现这个吗?我已经准备好了 Python 2.7.2 的源代码。

我在使用 centos 5.6,如果这有关系的话。

谢谢。

更新:ulimit -n 已经设置为 65535。启动 supervisord 时我遇到的完整错误信息是:

追踪记录(最近的调用在最前面): 文件 "/usr/local/bin/supervisord",第 8 行,在 load_entry_point('supervisor==3.0a10', 'console_scripts', 'supervisord')() 文件 "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py",第 372 行,在 main go(options) 文件 "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py",第 382 行,在 go d.main()
文件 "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py",第 95 行,在 main self.run()
文件 "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py",第 112 行,在 run self.runforever()
文件 "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/supervisord.py",第 230 行,在 runforever r, w, x = self.options.select(r, w, x, timeout)
文件 "/usr/local/lib/python2.7/site-packages/supervisor-3.0a10-py2.7.egg/supervisor/options.py",第 1113 行,在 select return select.select(r, w, x, timeout) 值错误:文件描述符超出 select() 的范围

1 个回答

4

这实际上是底层的 select(2) 系统调用的限制。

根据手册的说明:

An fd_set is a fixed size buffer.  Executing FD_CLR() or FD_SET() with a value of fd 
that  is  negative  or  is equal  to  or  larger  than  FD_SETSIZE will result in 
undefined behavior. 

而标准的 FD_SETSIZE 是 1024。

/usr/include/linux/posix_types.h:#define __FD_SETSIZE   1024

所以这并不是 Python 的问题。poll(2)epoll(2) 系统调用的限制要大得多。你真正需要做的是使用 select.epoll 对象(仍然在 select 模块中),而不是使用 `select`。

撰写回答