我想要某种接收事件的服务器(即使用套接字),并且每个事件都有不同的 ID(即目标端口号)。
有没有一种方法,从我看到特定 ID 的第一个数据包的那一刻起,我就开始某种超时(即 1 毫秒),如果在这段时间内没有收到任何具有相同 ID 的其他数据包,则会触发事件,但如果收到某些内容,超时将重置为 1ms。
我已经看到类似的事情可以通过使用signals
和SIGALARM
信号来完成。但是,我想为每个不同的 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/