Python select()中的filedescriptor超出范围-文件描述符泄漏?
我已经为python的socket模块编写了一个包装器,其中我使用select.select和一个只包含有超时的socket对象的rlist,以便允许有超时的recv。它看起来或多或少像这样:Python select()中的filedescriptor超出范围-文件描述符泄漏?,python,sockets,file-descriptor,Python,Sockets,File Descriptor,我已经为python的socket模块编写了一个包装器,其中我使用select.select和一个只包含有超时的socket对象的rlist,以便允许有超时的recv。它看起来或多或少像这样: def recv(self, timeout): ready, _, _ = select.select([self.socket], [], [], timeout) if ready: return self.socket.recv(4096) return "
def recv(self, timeout):
ready, _, _ = select.select([self.socket], [], [], timeout)
if ready:
return self.socket.recv(4096)
return ""
所以它主要做的是等待套接字准备好超时秒;如果到那时还没有准备好,它将返回一个空字符串,如果已经准备好,它将接收其中的内容,一般限制为2字节的幂次
这通常效果很好;但是,最近我开始在代码的select行中遇到异常,如下所示:
ValueError: filedescriptor out of range in select()
def close(self):
self.socket.close()
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
self.socket.setblocking(0)
我编写的程序使用了我编写的包装器,它是一个运行几个小时的脚本。看起来每次我运行它时,它都会在大约40分钟后失败,并出现此值错误。看来我的文件描述符有漏洞。但是,这些只是套接字,我相信我正在正确地关闭它们,因为我的包装器的.close方法如下所示:
ValueError: filedescriptor out of range in select()
def close(self):
self.socket.close()
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
self.socket.setblocking(0)
我正在使用python 2.7。我对我的问题理解不够透彻,无法生成一个完整的运行示例来演示我的问题
编辑
包装套接字对象的初始化如下所示:
ValueError: filedescriptor out of range in select()
def close(self):
self.socket.close()
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect((self.host, self.port))
self.socket.setblocking(0)
从“select”模块的文档中:您也可以自己定义一个包装类,只要它有一个适当的fileno方法,该方法真正返回一个文件描述符,而不仅仅是一个随机整数。如文件中所述。你的包装器类有'fileno'方法吗?我没有选择我的包装器类;我正在选择它包装的内容,这是一个真正的python套接字对象self.socket。