代码之家  ›  专栏  ›  技术社区  ›  Tader

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

  •  4
  • Tader  · 技术社区  · 17 年前

    考虑这个代码:

    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
    

    有人能帮我把这个号码提高到500以上吗?我正在尝试使用真实套接字(需求)模拟对等网络,只有50个模拟节点,每个节点有5个传出连接和5个传入连接,这将提供500个所需套接字的数量。

    顺便说一句,在Linux下运行同样的代码会给我提供大约1020个套接字,这是我喜欢的方式。

    2 回复  |  直到 17 年前
        1
  •  17
  •   ACoolie    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
    
        2
  •  1
  •   Chris Bunch    17 年前

    您是否在雪豹安装盘上安装了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