如何正确使用select中的超时参数?
我刚开始学习套接字编程(还有Python也不太熟),现在在服务器端遇到了一些麻烦,想让选择超时的功能按我想的方式工作。在客户端连接之前,超时工作得很好。我设置了1秒的超时,每隔1秒就会在我的循环中超时。
但是,一旦有客户端连接,它就不会等1秒再告诉我超时了。它只是尽可能快地循环,然后告诉我“超时到期”。这是我代码的一部分:
while running:
try:
self.timeout_expired = False
inputready, outputready, exceptready = select.select(self.inputs, self.outputs, [], self.timeout)
except select.error, e:
break
except socket.error, e:
break
if not (inputready):
# Timeout expired
print 'Timeout expired'
self.timeout_expired = True
# Additional processing follows here
我不确定这段代码是否足够让你看出我的问题所在,所以如果你需要更多的代码,请告诉我。基本上,在客户端连接后,它至少看起来是忽略了1秒的超时,反而是尽可能快地运行,不停地告诉我“超时到期”。你觉得我漏掉了什么吗?
非常感谢!!
补充说明:我应该澄清一下……“inputready”代表的是客户端连接或向服务器发送数据的输入,还有服务器的标准输入。其他从选择返回的变量只是服务器端的变量,而我想做的是检测客户端是否回复得太慢,所以我只检查inputready是否为空。
2 个回答
3
“当超时时间到达时,select()会返回三个空列表。...要使用超时功能,需要在调用select()时添加一个额外的参数,并在select()返回后处理这些空列表。”
readable, writable, exceptional = select.select(inputs, outputs, inputs,timeout)
if not (readable or writable or exceptional):
print(' timed out, do some other work here', file=sys.stderr)
7
只有当 inputready
、outputready
和 exceptready
都是空的时候,才算超时。我的猜测是你把客户端的套接字同时添加到了 self.inputs
和 self.outputs
里。因为输出套接字通常是可以写入的,所以它总是会出现在 outputready
里。只有在你准备好要输出内容的时候,才把客户端的套接字添加到 self.outputs
里。