Python:设置多个连续超时

标签 python sockets timeout signals

我想要某种接收事件的服务器(即使用套接字),并且每个事件都有不同的 ID(即目标端口号)。

有没有一种方法,从我看到特定 ID 的第一个数据包的那一刻起,我就开始某种超时(即 1 毫秒),如果在这段时间内没有收到任何具有相同 ID 的其他数据包,则会触发事件,但如果收到某些内容,超时将重置为 1ms。

我已经看到类似的事情可以通过使用signalsSIGALARM信号来完成。但是,我想为每个不同的 ID 保留多个“计时器”。

最佳答案

听起来像是 select 的工作。当您使用套接字时,您有一个客户端的套接字描述符(大概每个客户端都有一个,但只要有一个,它就可以工作)。因此,您要么要等到数据包到达其中一个套接字,要么等到发生超时。这正是select确实如此。

因此,在收到消息时计算每个客户端的过期时间,然后在主循环中,只需计算最快过期超时并将其提供为 timeout参数select.select (所有套接字描述符作为 rlist 参数)。然后,当新的数据包/消息到达或最旧的超时到期时,您就会被唤醒。如果是新数据包,则处理该数据包并将该提供程序的超时重置为 1 毫秒;否则,您将在超时到期时执行您所做的任何操作。

然后计算下次到期超时。冲洗。泡沫。重复。

类似这样的事情:

now = time.time()
timeout = min([(client.expiration - now) for client in clients_list])
rrdy, wrdy, xrdy = select.select([client.sock for client in clients_list], [], [], timeout)
if not rrdy:
    # Timeout
    now = time.time()
    for client in clients_list:
        if client.expiration < now:
            process_timeout(client)
else:
    # Process incoming messages
    for rsock in rrdy:
        process_message(rsock.recv(4096))
        client.expiration = time.time() + .001

关于Python:设置多个连续超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40115841/

相关文章:

ios - 代号一 - 无法从真实设备上的套接字读取

无法读取文件并获取结果

javascript - 清除超时 JavaScript 不工作

python - django 表单为关键字参数获取了多个值

Python - 值错误 : operands could not be broadcast together with shapes

python - 打印 MJPEG 帧

c - 最好有一个长的或多个短的 UDP 套接字?

python - 正则表达式 - 将子字符串与字符串匹配

c# - 如何更改BeginConnect的超时

javascript - Angularjs $timeout 不执行