如何在Python的select()函数中增加文件描述符范围

6

我正在测试Python的socket编程。在Mac上,我修改了选项如下所示:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 100000
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited
但是出现了以下错误。
Traceback (most recent call last):
  File "ssub.py", line 63, in createMqttClient
    rc = mqttc.loop()
  File "/Library/Python/2.7/site-packages/mosquitto.py", line 633, in loop
    socklist = select.select(rlist, wlist, [], timeout)
**ValueError: filedescriptor out of range in select()**

如何在编写 select () 函数时增加文件描述符数量?
1个回答

7

select()支持的文件描述符数量是有限制的,最简单的解决方法是改用poll(),它不受此限制。

严格来说,select()受支持的最高文件描述符数量受限,而不是在每个调用中支持的文件描述符数量 - 参见select()手册注释部分。我不确定OSX上的FD_SETSIZE是多少,但在Linux上它是1024。从Python中没有实际的方法来增加这个限制。

顺便说一下,如果您想保持可移植性,可以考虑使用pyev之类的东西,它是围绕着libev库的Python包装器,可以在给定平台上使用最佳的IO等待方法。


1
注意:在Windows下,限制是不同的——在Windows下,重要的是描述符的数量,而不是最大描述符的值。 - Jeremy Friesner
啊,是的,说得好。想起来了,我并不完全确定在Windows上没有办法调整限制,但我不知道有没有这样的方法。这可能很方便,因为我不认为poll()在Windows上可用。 - Cartroo
现代版本的Windows确实有WSAPoll(),它与poll()基本相同... - Jeremy Friesner
以前知道这个问题,但是在Python应用程序中加入任何特定于操作系统的代码很烦人(尽管我意识到有时是不可避免的)。除非你指的是Python的select模块已经更新为使用WSAPoll() - Cartroo
我自己还没有测试过,但希望Python的select.poll()方法会在拥有WSAPoll()版本的Windows上调用WSAPoll()... - Jeremy Friesner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接