我为python的socket
模块编写了一个包装器,我在其中使用select.select
,rlist
只包含带有timeout
的套接字对象,以便允许{ {1}}超时。它看起来(或多或少)像这样:
recv
所以它的作用主要是等待套接字准备好def recv(self, timeout):
ready, _, _ = select.select([self.socket], [], [], timeout)
if ready:
return self.socket.recv(4096)
return ""
秒;如果没有准备就绪,它会返回一个空字符串,如果它已准备就绪,它会收到其中的内容,直到2字节的某些功率的常见限制。
这通常很好用;但是,最近我开始遇到代码中选择行中的异常,看起来像这样:
timeout
我编写的程序,使用我编写的包装器,是一个运行几个小时的脚本。看起来每次我运行它都会在约40分钟后失败并显示ValueError: filedescriptor out of range in select()
。看起来我的文件描述符有一些泄漏。但是,这些只是套接字,我相信我正在关闭它们,因为我的包装器的ValueError
方法看起来像这样:
.close()
我正在使用python 2.7。我不能很好地理解我的问题,无法生成一个自包含的运行示例来演示我的问题。
包装的套接字对象的初始化如下所示:
def close(self):
self.socket.close()