Concurrency 如何在Clojure中创建一个持续运行的后台进程?

Concurrency 如何在Clojure中创建一个持续运行的后台进程?,concurrency,clojure,Concurrency,Clojure,如何在Clojure中创建一个持续运行的后台进程?将“未来”与一个永远不会结束的循环一起使用是正确的方式吗?可能是,或者是Lein daemon 我的简单高阶无限循环函数(使用期货): 我强烈建议使用atom或Clojures其他引用类型之一来存储结果(根据上面示例中的计数器) 稍加调整,您还可以使用此方法以线程安全的方式启动/停止/暂停进程(例如,测试标志,查看是否应在循环的每个迭代中执行(函数)。您可以使用永远运行的函数启动线程 (defn forever [] ;; do stuff

如何在Clojure中创建一个持续运行的后台进程?将“未来”与一个永远不会结束的循环一起使用是正确的方式吗?

可能是,或者是Lein daemon

我的简单高阶无限循环函数(使用期货):

我强烈建议使用atom或Clojures其他引用类型之一来存储结果(根据上面示例中的计数器)


稍加调整,您还可以使用此方法以线程安全的方式启动/停止/暂停进程(例如,测试标志,查看是否应在循环的每个迭代中执行(函数)。

您可以使用永远运行的函数启动线程

(defn forever []
  ;; do stuff in a loop forever
)

(.start (Thread. forever))
如果不希望后台线程阻止进程退出,请确保将其设置为守护进程线程:

(doto 
   (Thread. forever)
   (.setDaemon true)
   (.start))
如果您想更精细一些,可以使用java.util.concurrent.Executors工厂来创建ExecutorService。这使得创建线程池、使用自定义线程工厂、自定义传入队列等变得容易


lib将一些工作执行内容封装到一个更为clojure友好的api中,如果这正是您所追求的。

它允许您暂停执行吗?p.s.还很高兴知道这种方法的开销非常小-如果您删除线程/休眠,每秒可以获得超过一百万个计数器增量不会消耗堆栈的实现
(defn无限[f秒](未来(循环[](f)(线程/睡眠(*1000秒))(重现)))
@James-我的实现也不会消耗堆栈。对
无限循环
的递归调用在未来内部这一事实意味着它不会在原始函数的堆栈框架内重复出现。
(doto 
   (Thread. forever)
   (.setDaemon true)
   (.start))