Asynchronous Clojure-永久运行的应用程序?

Asynchronous Clojure-永久运行的应用程序?,asynchronous,concurrency,clojure,Asynchronous,Concurrency,Clojure,我见过一些类似的问题,但没有什么特别的,作为一个新的Clojure开发人员,我不确定其中是否有最佳实践 基本上,我有一个应用程序,每隔几秒钟需要访问一个数据库并迭代每个项目。然后,根据特定条件,需要生成一个新线程,并对将插入到单独数据库中的项执行一些工作 我的问题是,在clojure中启动和运行这样的应用程序的最佳方式是什么,这需要持续运行。我目前的想法是只阻塞主线程,然后生成一个新线程,它将是我的主循环,然后生成上面提到的其他线程。我不确定这是实现这一目标的最佳方式,还是我忽略了实现目标的更好

我见过一些类似的问题,但没有什么特别的,作为一个新的Clojure开发人员,我不确定其中是否有最佳实践

基本上,我有一个应用程序,每隔几秒钟需要访问一个数据库并迭代每个项目。然后,根据特定条件,需要生成一个新线程,并对将插入到单独数据库中的项执行一些工作


我的问题是,在clojure中启动和运行这样的应用程序的最佳方式是什么,这需要持续运行。我目前的想法是只阻塞主线程,然后生成一个新线程,它将是我的主循环,然后生成上面提到的其他线程。我不确定这是实现这一目标的最佳方式,还是我忽略了实现目标的更好方式

我看不出有任何理由从主线程生成新线程,只是为了等待它。您可以从主线程运行主循环,如下所示:

(defn spawn-db-thread! []
  (doto (Thread. #(println "Doing something with the db here..."))
    (.start)))

(defn run-loop [max]
  (loop [n max]
    (when (pos? n)
      (spawn-db-thread!)
      (Thread/sleep 1000)
      (recur (dec n)))))
这个代码段将运行最多次,在每次迭代中,它将启动一个线程,在本例中,该线程只是将一些内容打印到控制台。到时候会的 睡一会儿。我只是为了测试目的添加了max参数,如果需要,可以省略它

当然,如果你想建造一些新奇的东西,你应该去图书馆看看


另外,可能不需要在单独的线程中执行db处理,我只需要在主线程上运行它。但这取决于你自己。

这取决于你希望应用程序是怎样的。你可以在里面有一个quartz调度器,并且有可以执行查询的作业。由于应用程序需要每隔一秒钟左右查询一次数据库,因此需要数据库池。您可以使用未来生成其他工作线程

另一种方法是让调度器位于应用程序之外,并使用cron作业调用应用程序或端点


如果您想要分布式服务altogther,可以使用onyx。同样,这取决于辅助任务的复杂程度和用例

我认为你需要提供更多的信息才能得到一个合理的答案。展示一个你正在尝试做的简单例子。有许多不同的并发选项,从处理作业的futures,到处理更复杂消息的clojure.async。只需直接从main跳转到主循环,并将future用于其他线程。我看不出有什么问题。