4

我是套接字编程的新手(对 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”代表来自连接或发送数据到服务器的客户端的输入,以及来自服务器的标准输入。从 select 返回的其他变量只是服务器端变量,我想要做的是检测 CLIENT 是否花了太长时间来回复,所以我只检查 inputready 是否为空。

4

2 回答 2

4

inputready如果、outputreadyexceptready都是空的,它只是一个超时。我的猜测是您已将客户端套接字添加到self.inputsself.outputs. 由于输出套接字通常是可写的,所以它总是显示在outputready. 仅self.outputs当您准备好输出某些内容时才添加客户端套接字。

于 2013-03-04T05:58:51.843 回答
-1

“当超时到期时,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]

于 2019-04-09T17:11:36.190 回答