我已经看到了一些类似的问题,但没有什么是非常具体的,并且是一个新的Clojure开发人员并不确定它们是否是最佳实践。
基本上,我有一个应用程序,每隔几秒就需要访问一个数据库并遍历每个项目。然后,根据某些条件,需要生成一个新线程并对项目执行一些工作,然后将这些项目插入到单独的数据库中。
我的问题是在clojure中启动和运行这样的应用程序的最佳方法是什么,需要不断运行。我目前的想法是阻止主线程,然后生成一个新的主线程,然后生成上面提到的其他主线程。我不确定这是否是实现这一目标的最佳方式,或者我是否忽略了实现目标的更好方法。
答案 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。同样,它取决于工作任务的复杂程度和用例。