如何正确使用select中的超时参数?

6 投票
2 回答
13649 浏览
提问于 2025-04-17 17:49

我刚开始学习套接字编程(还有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)

[https://pymotw.com/3/select/index.html][1]

7

只有当 inputreadyoutputreadyexceptready 都是空的时候,才算超时。我的猜测是你把客户端的套接字同时添加到了 self.inputsself.outputs 里。因为输出套接字通常是可以写入的,所以它总是会出现在 outputready 里。只有在你准备好要输出内容的时候,才把客户端的套接字添加到 self.outputs 里。

撰写回答