在(clojure的内部)线程池中执行任务的惯用方法?

时间:2015-04-24 12:14:56

标签: multithreading clojure parallel-processing

我需要在后台执行任务。他们没有产生有趣的价值,他们的副作用是他们的存在理由。这些影响将在其他地方观察到。

我在clojure中找不到任何只接受函数并在后台线程中执行它的函数/宏。未来可能是匹配,但我有点不确定,因为我永远不会解除引用它。这本身并不是问题,但我有点担心,如果将来的对象被垃圾收集并且未来还没有开始执行,是否有可能取消未来?

我正在做这样的事情:

(doseq [task-fn task-fns]
  (future (task-fn))

2 个答案:

答案 0 :(得分:3)

使用future分离副作用的线程并没有错。无论你是否要对结果进行deref,这都无关紧要。不,由于gargabe收集,future线程不会被取消。

正如另一位用户所提到的,你绝对可以直接使用Java的线程执行机制。您选择的只是风格问题。我倾向于亲自使用future

如果您正好使用core.async,则threadgo的使用被认为更合适(因为我认为是实际和文体原因的组合,因为它返回一个频道)。但我猜这不是你的情况。

答案 1 :(得分:2)

Clojure函数实现了Runnable,因此您可以将它们转换为将在后台完成的线程。请在此处查看此答案 - https://stackoverflow.com/a/1768706/827617

相关问题