雪豹系统上的Python,如何打开>255个套接字?

4

考虑以下代码:

import socket
store = []
scount = 0
while True:
    scount+=1
    print "Creating socket %d" % (scount)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    store.append(s)

给出以下结果:
Creating socket 1
Creating socket 2
...
Creating socket 253
Creating socket 254
Traceback (most recent call last):
  File "test_sockets.py", line 9, in <module>
  File     "/opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/socket.py", line 159, in __init__
socket.error: (24, 'Too many open files')

检查sysctl允许的打开文件数量:

$ sysctl -A |grep maxfiles
kern.maxfiles = 12288
kern.maxfilesperproc = 10240
kern.maxfiles: 12288
kern.maxfilesperproc: 10240

这比我成功打开的253个套接字要多得多...

请问能否帮助我将此数字增加到500以上?我正在尝试使用真实套接字(必需)模拟点对点网络,只有50个模拟节点和每个节点5个出站连接和5个入站连接,需要500个套接字。

顺便说一下,在Linux下运行相同的代码可以获得约1020个套接字,这更符合我的喜好。

2个回答

17

您可以使用ulimit增加可用套接字数量。在bash中,非root用户的最大值似乎为1200。但我可以在zsh中获得高达10240个。

$ ulimit -n 1200
$ python sockets
....
Creating socket 1197
Creating socket 1198
Traceback (most recent call last):
  File "sockets", line 7, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/socket.py", line 182, in __init__
socket.error: [Errno 24] Too many open files

1
你是否安装了Snow Leopard安装盘中的XCode和开发者工具?我能够打开比你更多的端口:
Creating socket 1
Creating socket 2
...
Creating socket 7161
Creating socket 7162
Creating socket 7163
Creating socket 7164
Creating socket 7165
Creating socket 7166
Traceback (most recent call last):
  File "socket-test.py", line 7, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/socket.py", line 159, in __init__
socket.error: (24, 'Too many open files')

sysctl 显示的信息比你的输出显示的要多得多(即使使用 grep),但是你列出的四行与我的完全匹配,所以我能想到的就是需要从磁盘上的开发工具中获取某些东西。


我想我已经安装了随Snow Leopard附带的Xcode。它显示版本为3.2,64位,Xcode IDE:1610.0,Xcode Core:1608.0。你能告诉我你的电脑上“which python”显示的是什么吗? - Tader

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