pythonsocket给出了;[Errno 24]打开的文件太多”;

pythonsocket给出了;[Errno 24]打开的文件太多”;,python,sockets,Python,Sockets,我有以下UDP类以大约100Hz的频率发送数据数组 from six import string_types import socket import struct def convert_data(iterable): if isinstance(iterable, string_types): return str(iterable) data = tuple(iterable) format = "{0}H".format(len(data))

我有以下UDP类以大约100Hz的频率发送数据数组

from six import string_types
import socket
import struct

def convert_data(iterable):
    if isinstance(iterable, string_types):
        return str(iterable)
    data = tuple(iterable)
    format = "{0}H".format(len(data))
    print("Sending data:", format, data)
    if max(data) > 2**16 - 1:
        raise ValueError(max(data))
    if min(data) < 0:
        raise ValueError(min(data))
    return struct.pack(format, *data)

class UDP(object):
    def __init__(self, ip, port):
        self._ip = ip
        self._port = port
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.socket.connect((ip, port))

    def send_data(self, data):
        message = convert_data(data)
        return self.socket.sendall(message)

很可能,您正在为
的每一次迭代创建一个新套接字,while(True):
。进程被限制为可以打开的文件描述符的数量(套接字是FD)。您可以检查
/etc/security/limits.conf
,查看您的限制设置为多少

您应该在使用完套接字后关闭它,或者,理想情况下,只打开一个,并在可能的情况下重新使用它

您说过您的另一个模块“可能看起来像这样。”那个代码片段就是它的样子吗

我对此表示怀疑,因为如果是这样的话,那应该只能制作一个插座。如果您在
while
中实例化UDP对象,那么上述问题肯定是您的问题

class UDP(object):

    def __init__(self, ip, port):
        self._ip = ip
        self._port = port
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.socket.connect((ip, port))
关于UDP,您需要知道的是它是一个无会话、无连接的协议,这意味着:
self.socket.connect((ip,int(port))
不正确,因此您应该删除它

如果要连接到服务器,请改用Tcp:

class TCP(object):

    def __init__(self, ip, port):
        self._ip = ip
        self._port = port
        self.socket = socket.socket() #Here is the change
        self.socket.connect((ip, port))

    def send_data(self, data):
        message = convert_data(data)
        return self.socket.sendall(message)

希望有帮助

您仍然缺少一些代码--
send\u data
实际上没有发送任何内容,只需设置一个局部变量并返回。您发布的代码不会显示您描述的问题。请张贴您实际使用的代码。我的代码基本上是这样的。。。然而,为了证明你错了,我基本上使用了这段代码,几分钟后它仍然没有崩溃。我想说,我可能已经找到了我的bug的原因,一个部分这里是“基本上是这个”和“这个”之间的区别。非常感谢,更新了我的问题。你完全正确,我只是犯了一个初学者的编码错误。非常感谢!
class UDP(object):

    def __init__(self, ip, port):
        self._ip = ip
        self._port = port
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.socket.connect((ip, port))
class TCP(object):

    def __init__(self, ip, port):
        self._ip = ip
        self._port = port
        self.socket = socket.socket() #Here is the change
        self.socket.connect((ip, port))

    def send_data(self, data):
        message = convert_data(data)
        return self.socket.sendall(message)