Clojure - 永久运行应用程序?

时间:2018-05-04 01:23:13

标签: asynchronous concurrency clojure

我已经看到了一些类似的问题,但没有什么是非常具体的,并且是一个新的Clojure开发人员并不确定它们是否是最佳实践。

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

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

2 个答案:

答案 0 :(得分:1)

我没有看到任何理由从main生成新线程,只是等待它。您可以从主线程运行“主循环”,如下所示:

(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次,并且在每次迭代时,它将启动一个线程(在这种情况下)只是向控制台输出内容。然后它会 睡了一秒钟。我刚刚添加了max参数用于测试目的,如果需要,可以将其删除。

当然,如果你想构建一些花哨的东西,你应该查看core.async库。

另外,也许没有必要在单独的线程中进行db处理,我只是在主线程上运行它。但这取决于你。

答案 1 :(得分:0)

这取决于您希望应用程序的运行方式。你可以在里面有一个石英调度程序,并有可以进行查询的作业。由于应用程序需要每隔一秒左右查询db,因此请使用db pooling。您可以使用期货来产生额外的工作线程。

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

如果您需要分布式服务altogther,可以使用onyx。同样,它取决于工作任务的复杂程度和用例。