Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:设置多个连续超时_Python_Sockets_Timeout_Signals - Fatal编程技术网

Python:设置多个连续超时

Python:设置多个连续超时,python,sockets,timeout,signals,Python,Sockets,Timeout,Signals,我想让某种服务器接收事件(即使用套接字),每个事件都有不同的ID(即dst端口号) 是否有一种方法,从我看到特定ID的第一个数据包的那一刻起,我就开始某种超时(即1ms),如果在这段时间内没有收到任何其他具有相同ID的数据包,则会触发一个事件,但如果收到某个数据包,则会将超时重置为1ms 我已经看到,通过使用信号和SIGALARM信号可以实现类似的功能。但是,我想为每个不同的ID保留多个“计时器”。请参阅内置模块,它有一个调度程序 您可以构造一个新的调度程序实例,然后使用调度程序。输入以调度延迟

我想让某种服务器接收事件(即使用套接字),每个事件都有不同的ID(即dst端口号)

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

我已经看到,通过使用
信号
SIGALARM
信号可以实现类似的功能。但是,我想为每个不同的ID保留多个“计时器”。

请参阅内置模块,它有一个调度程序


您可以构造一个新的调度程序实例,然后使用
调度程序。输入
以调度延迟后要调用的函数;如果您在时间限制内收到消息,则可以使用
调度程序从队列中删除其事件。取消(事件)
;您可以使用
调度程序.run()
在另一个线程中运行调度程序,也可以使用
调度程序.run(blocking=False)
在具有超时的选择多路复用线程中运行。

听起来像是
选择的作业。当您使用套接字时,您有一个客户端的套接字描述符(每个客户端大概有一个,但只要有一个,它就可以工作)。因此,您要么希望等待数据包到达某个套接字,要么等待超时发生。这正是
select
所做的

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

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

大概是这样的:

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
now=time.time()
timeout=min([(client.expiration-now)用于客户端列表中的客户端])
rrdy,wrdy,xrdy=select.select([client.sock代表客户端列表中的客户端],[],超时)
如果不是rrdy:
#超时
now=time.time()
对于客户端列表中的客户端:
如果client.expiration<现在:
进程超时(客户端)
其他:
#处理传入消息
对于rrdy中的rsock:
处理消息(rsock.recv(4096))
client.expiration=time.time()+.001

我想要的可能的重复项是不同的,在回答中,他们只给出了一个示例,说明了如何在X时间后使用
threading.Timer执行函数。例如,我想监听一些事件,直到一个事件在1ms后没有出现,但仍在监听其他正在到达且未“过期”的事件。在运行时,能否将事件输入计划程序?因为每次我收到一个事件,我都必须取消并再次输入它。如果我在10毫秒内收到1000个相同时间的事件(这意味着我每次都必须取消并输入一个新的计时器),这是否会表现良好。从理论上讲,同一类型的事件都是一起发生的,但我不知道什么时候考虑它们都被接收,所以我必须在一段时间内不接受它们的时候进行监控。我认为这应该是可行的,但是如果两者之间的操作太多,我可能会遇到问题,不是吗?因为超时时间太小了。