我想为服务器发送长度前缀数据的协议编写客户端。数据需要非常重要的解码和处理,并且客户端在任何时候都只需要最新的可用数据:如果有更多可用数据,则需要刷新旧条目并仅使用最新条目。这是为了避免客户花费大量时间处理数据,使其开始越来越多地落后于服务器。
我可以轻松实现用twisted.protocols.basic.IntNStringReceiver
读取长度前缀数据,但我如何检查是否有更多可用数据?我可能想要做的是调用套接字上的select为零超时,以查看从套接字读取是否会阻塞,如果不是,我只是跳过所有解码和处理。套接字当然在Protocol.dataReceived
方法调用中不可用。另一个想法是将数据存储在某处并开始延迟,如果在延迟触发之前再次调用该方法,则覆盖数据。即使在没有更多数据可用的通常情况下,这也会产生持续的延迟。是否有某种方法可以很好地适应Twisted编程模型?
答案 0 :(得分:1)
Twisted中没有任何提前查看的API,可以让您知道在某个即将交付的缓冲区中是否有数据等待。
我认为你的第二个想法很好 - 只要你注意到你可以选择一个任意小的恒定延迟。例如,您可以选择0秒。在实践中,这会引入稍长的延迟(除非你有一台非常快的计算机;)但它仍然足够小,你可能不会注意到它。
可能还值得知道,Twisted反应堆试图将基于时间的事件的处理与基于文件描述符的事件的处理交错。如果您还不知道这一点,那么您可能会怀疑在发生更多I / O之前使用reactor.callLater(0, f)
会调用f
。虽然不能确切地确定事件是如何排序的,但所有与Twisted一起提供的反应器只是来回传递:处理所有I / O事件,处理所有时间事件,重复。
如果你只挑选一个略大的值,也就是1毫秒的1/10,那么你几乎可以肯定,如果在计时器到期之前没有再次调用dataReceived
,那么就没有#39 ; t任何本地接收的数据即将发送到您的应用程序。