2013-01-10 30 views
3

我測試python socket編程。並修改選項如下圖所示是在Mac如何增加python select中的filedescriptor的範圍select()

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()功能?

回答

5

select()支持的文件描述符的數量是有限制的 - 最簡單的解決方案是簡單地使用poll(),而不受此限制的限制。

嚴格地說,select()是最高的文件描述符它可以支持有限的,因爲在給定的通話反對他們的數目 - 看到票據開始select() manpage部分。我不確定在OSX上有什麼FD_SETSIZE,但在Linux上它是1024.沒有可行的方法來增加Python的這種限制。另外,如果你想保持可移植性,你可以考慮使用類似pyev的東西,這是一個圍繞libev庫的Python包裝,它使用在給定平臺上等待IO的最佳方法。

+1

注意:在Windows下,限制是不同的 - 在Windows下,重要的是描述符的數量,而不是最大描述符的值。 –

+0

啊,是的,好點。來想一想,我並不完全確定沒有辦法擺脫Windows上的限制,但我不知道其中之一。它可能很方便,因爲我不相信'poll()'在Windows上可用。 – Cartroo

+0

現代版本的Windows確實擁有WSAPoll(),它幾乎與poll()相同... –