Python 跳过Twisted协议处理程序中的过时数据

Python 跳过Twisted协议处理程序中的过时数据,python,twisted,Python,Twisted,我想为服务器发送长度前缀数据的协议编写一个客户端。数据需要非平凡的解码和处理,客户机在任何时候都只需要最新的可用数据:如果有更多可用数据,最好刷新旧条目,只使用最新的条目。这是为了避免客户机花费太多时间处理数据,以至于开始越来越多地落后于服务器的情况 我可以使用twisted.protocols.basic.IntNStringReceiver轻松实现读取长度前缀数据,但如何检查是否有更多可用数据?我可能想做的是用零超时调用套接字上的select,看看从套接字读取是否会阻塞,如果不是,我就跳过所

我想为服务器发送长度前缀数据的协议编写一个客户端。数据需要非平凡的解码和处理,客户机在任何时候都只需要最新的可用数据:如果有更多可用数据,最好刷新旧条目,只使用最新的条目。这是为了避免客户机花费太多时间处理数据,以至于开始越来越多地落后于服务器的情况


我可以使用
twisted.protocols.basic.IntNStringReceiver
轻松实现读取长度前缀数据,但如何检查是否有更多可用数据?我可能想做的是用零超时调用套接字上的select,看看从套接字读取是否会阻塞,如果不是,我就跳过所有解码和处理。套接字当然在
协议中不可用。dataReceived
方法调用。另一个想法是将数据存储在某个地方并启动延迟,如果在延迟触发之前再次调用该方法,则覆盖数据。即使在没有更多可用数据的通常情况下,这也会造成持续的延迟。有什么方法可以很好地适应Twisted编程模型吗?

Twisted中没有任何预先查看的API可以让您知道缓冲区中是否有数据等待交付

我认为你的第二个想法很好——只要你注意到你可以选择任意小的恒定延迟。例如,您可以选择0秒。实际上,这会带来稍长的延迟(除非你有一台速度非常快的计算机),但它仍然足够小,你可能不会注意到它

还值得一提的是,Twisted reactor试图将基于时间的事件处理与基于文件描述符的事件处理交织在一起。如果您不知道这一点,那么您可能会怀疑使用
reactor.callLater(0,f)
会在任何I/O发生之前调用
f
。虽然不能保证事件是如何排序的,但Twisted附带的所有反应器只是来回运行:处理所有I/O事件,处理所有时间事件,然后重复

如果您只选择稍大的值,可能是1毫秒的1/10,那么您可以非常确定,如果在计时器过期之前没有再次调用
dataReceived
,那么就不会再有任何本地接收的数据即将发送到您的应用程序