我需要在后台执行任务。他们没有产生有趣的价值,他们的副作用是他们的存在理由。这些影响将在其他地方观察到。
我在clojure中找不到任何只接受函数并在后台线程中执行它的函数/宏。未来可能是匹配,但我有点不确定,因为我永远不会解除引用它。这本身并不是问题,但我有点担心,如果将来的对象被垃圾收集并且未来还没有开始执行,是否有可能取消未来?
我正在做这样的事情:
(doseq [task-fn task-fns]
(future (task-fn))
答案 0 :(得分:3)
使用future
分离副作用的线程并没有错。无论你是否要对结果进行deref,这都无关紧要。不,由于gargabe收集,future
线程不会被取消。
正如另一位用户所提到的,你绝对可以直接使用Java的线程执行机制。您选择的只是风格问题。我倾向于亲自使用future
。
如果您正好使用core.async
,则thread
或go
的使用被认为更合适(因为我认为是实际和文体原因的组合,因为它返回一个频道)。但我猜这不是你的情况。
答案 1 :(得分:2)
Clojure函数实现了Runnable,因此您可以将它们转换为将在后台完成的线程。请在此处查看此答案 - https://stackoverflow.com/a/1768706/827617