3
假设我有一个ref状态,每30秒更新一次,我想附加一个fn,可能需要更长时间才能完成。假设在时间0 ref被更新并且在时间fn被调用30 ref被再次更新,但是fn仍在运行。我是否获得了同一个函数的两个副本运行,或者是否只是在时间60跳过并执行,假设fn在那时返回?Clojure refs和add-watch
编辑:我想改变裁判的状态。它在其他地方更新,我只是试图用它作为触发器来做一些控制计算。
假设我有一个ref状态,每30秒更新一次,我想附加一个fn,可能需要更长时间才能完成。假设在时间0 ref被更新并且在时间fn被调用30 ref被再次更新,但是fn仍在运行。我是否获得了同一个函数的两个副本运行,或者是否只是在时间60跳过并执行,假设fn在那时返回?Clojure refs和add-watch
编辑:我想改变裁判的状态。它在其他地方更新,我只是试图用它作为触发器来做一些控制计算。
如果您使用ref,那么两个函数将平行运行,并争夺产生ref的下一个状态的权利,同时失败者必须再次运行。
这是refs和代理之间的区别之一。代理按顺序运行,因为它们有一个等待运行的函数队列。
fn不会更改参考。它实际上是基于ref做一些计算。它所做的是基于它控制一堆角色的世界状态。我不想要的是两个函数试图修改字符。 –
使用ref(如第一点),你很可能不会得到你正在寻找的结果。向代理添加手表应该更接近你想要的。 –
如果您必须使用ref,您可以添加一个监视器,将更新函数发送给代理。这样你的更新功能将不会被称为额外的时间。 –