【问题标题】:Clojure agents: rate limiting?Clojure 代理:速率限制?
【发布时间】:2012-05-06 14:08:24
【问题描述】:

好的,所以我在 Clojure 中有这个小 procedural SVG editor

它有一个代码窗格,用户可以在其中创建生成 SVG 文档的代码,以及一个预览窗格。每当代码更改时,预览窗格都会更新。

现在,在文本更改事件中,代码在 UI 线程(Ewwwww!)上重新编译,并且预览窗格更新。编译步骤应该改为异步进行,代理似乎是该问题的一个很好的答案:要求代理在更新时重新编译代码,并将结果传递给图像窗格。

我还没有使用代理,我不知道它们是否与隐式队列一起使用,但我怀疑是这样。就我而言,我对计算“中间”步骤的兴趣为零(想想快速击键:如果击键发生在重新编译开始之前,我只想放弃重新编译)——即我想要一个 send 覆盖任何待处理的代理计算。

我该如何做到这一点?有什么提示吗?甚至是代码示例?我的胡言乱语还有意义吗?

谢谢!

【问题讨论】:

    标签: swing events clojure agents seesaw


    【解决方案1】:

    您描述了一个需要处理执行流控制而不是共享状态管理的问题。因此,您可能希望暂时离开 STM 并研究 futures:它们仍然作为代理在线程池中执行,但可以通过调用 future-cancel 来停止它们而不是代理,并使用future-cancelled? 检查他们的状态。

    没有强有力的保证未来正在执行的线程can be effectively stopped。不过,您的代码将能够尝试取消未来,并继续安排下一次重新编译。

    【讨论】:

      【解决方案2】:

      代理确实在队列上工作,因此每个函数都获取代理的状态并产生代理的下一个状态。代理随着时间的推移跟踪身份。这听起来比您需要的要多一点,原子更适合您的任务,并且以非常相似的方式使用。

      【讨论】:

        猜你喜欢
        • 2014-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-17
        • 2020-02-03
        相关资源
        最近更新 更多