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

Idiomatic way to execute a task in (clojure's internal) thread pool?

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

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

我正在做这样的事情:

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

Clojure 函数实现了 Runnable,因此您可以将它们变成将在后台完成的线程。在这里查看这个答案 -

使用 future 分拆线程以产生副作用并没有错。是否要取消引用结果并不重要。不,future 线程不会因收集垃圾而被取消。

正如另一位用户提到的,您完全可以直接使用Java的线程执行机制。您选择哪种实际上只是风格问题。我个人倾向于使用future

如果您恰好在使用 core.async,则使用 threadgo 被认为更合适(因为我 认为 是一个组合出于实际和风格原因,因为它 returns 一个频道)。但我猜这不是你的情况。