在Snow Leopard上,Python如何打开超过255个套接字?

4 投票
2 回答
12965 浏览
提问于 2025-04-15 14:00

考虑一下这段代码:

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 -A |grep maxfiles
kern.maxfiles = 12288
kern.maxfilesperproc = 10240
kern.maxfiles: 12288
kern.maxfilesperproc: 10240

这个数字远远超过我能成功打开的253个套接字...

有人能帮我把这个数字提高到500以上吗?我正在尝试用真实的套接字模拟一个点对点网络(这是要求),如果只有50个模拟节点,每个节点有5个出站和5个入站连接,那就需要500个套接字。

顺便说一下,在Linux下运行同样的代码,我能打开大约1020个套接字,这样的结果我更喜欢。

2 个回答

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),不过你那四行和我的完全一样,所以我想可能是需要从安装盘上的开发工具里获取一些东西。

17

你可以通过 ulimit 来增加可用的套接字数量。在 bash 中,非管理员用户的最大数量似乎是 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

撰写回答