来自长期运行的Clojure函数的进度更新

时间:2014-01-23 19:15:44

标签: clojure callback watch

我写了这个辅助函数:

(defn iterate-converge
  "Returns the value from calling (f x) some number of times, until
  `x` changes by less than a tolerance, `tol`. Will not execute more
  than `b` (e.g. bailout) times."
  [f x0 tol b]
  (loop [f f x x0 tol tol b b i 0]
    (if (>= i b)
      (throw (ex-info "Failed to converge"
                      {:type ::failed-to-converge :tol tol :b b}))
      (let [x' (f x)]
        (if (< (abs (- x x')) tol)
          x'
          (recur f x' tol b (inc i)))))))

根据参数,这可能需要很长时间。我想要关于其进展的功能报告。我不希望它与控制台输出相关联(例如println)。

我目前的想法:

  1. 添加回调函数作为参数。每次通过都要调用它。这允许推送通知。
  2. 添加原子作为参数。每次通过都要更新。这将允许使用add-watch轮询推送通知。
  3. 添加core.async频道作为参数。与上面的(1)类似,但可能会提供更好的多核性能。
  4. 你会做什么以及为什么?

2 个答案:

答案 0 :(得分:3)

让它返回一个懒惰的候选答案序列。然后你可以在闲暇时迭代它们,只要答案可以接受就停止,或者你决定它花了太长时间而你想放弃。

答案 1 :(得分:2)

我个人会按相反顺序对这些选项进行排名,#3最灵活,因为这样你就可以用更有趣(和有趣)的方式处理输出。

如果您正在寻找更多选项,我可以推荐Narrator library作为准确生成长期运行流程的定期报告的方法。

相关问题