好的,所以我在Clojure中有这个小procedural SVG editor。
它有一个代码窗格,用户可以在其中创建生成SVG文档的代码和预览窗格。每当代码更改时,预览窗格都会更新。
现在,在文本更改事件中,代码在UI线程(Ewwwww!)上重新编译,并且更新了预览窗格。编译步骤应该异步发生,并且代理似乎是解决该问题的好方法:让代理在更新时重新编译代码,并将结果传递给图像窗格。
我还没有使用代理,我不知道它们是否使用隐式队列,但我怀疑是这样。在我的情况下,我对计算“中间”步骤没有兴趣(考虑快速击键:如果在重新编译开始之前发生击键,我只想丢弃重新编译) - 即我想要一个send
覆盖任何挂起的代理计算。
我该如何实现?任何提示?甚至代码样本?我的漫步是否有意义?
谢谢!
答案 0 :(得分:2)
代理确实在队列上工作,因此每个函数都获取代理的状态并生成代理的下一个状态。代理商随时跟踪身份。这听起来比你需要的多一点,原子稍微适合你的任务并以非常类似的方式使用。
答案 1 :(得分:2)
您描述的问题是处理执行流控制而不是共享状态管理。因此,您可能希望将STM分开一段时间并查看期货:它们仍然作为代理在线程池中执行,但是可以通过调用{{1}来停止它们而不是代理},并使用future-cancel
检查其状态。
没有强有力的保证未来正在执行的线程can be effectively stopped。尽管如此,您的代码仍然可以尝试取消未来,然后继续安排下一次重新编译。