这是我的情况,我有一个外部程序,每隔30个左右向我发送一次数据。该数据合并到ref。
此时我有,
(def state (ref {})
单独的未来将数据包读取并合并到此参考。
现在我有了我的状态机,即做决定并发回控制命令。基本上每个州都有以下结构,
(while (some-thing-happening)
(calc-stuff)
(send-correction))
这是我的问题,如果我每秒收到100个数据包,则发送200个命令/秒是没有意义的。所以我想提出一个能够限制更新率的方案。我无法入睡一段时间因为更新率不确定。你会如何构建这个?
答案 0 :(得分:1)
首先,您需要一种措施来防止在没有数据到达时工作。你可以通过
来实现这一目标some-thing-happening
直到数据包到达。如果API允许,并且没有回调,请使用它。其次,您可能希望将您的州建模为代理:
(def state (agent {}))
这样,你可以说
(defn update-state [state data]
; e.g.
(merge state data))
;; in the state machine
(send state correct data)
在单独的帖子中更新你的状态。
您甚至可以直接从您阅读它们的地方向代理发送程序包,并在update-state
中实现状态机。
答案 1 :(得分:0)
更改参考号时调用状态机功能。这样,您可以以与数据更改相同的速率发送命令。
或者,使用另一个ref作为标志并在更新数据时将其设置为true,将标志作为条件添加到while循环。并在更新后将其重置为false。