【问题标题】:Clojure - Permanently Running Application?Clojure - 永久运行的应用程序?
【发布时间】:2018-05-04 01:23:13
【问题描述】:

我看到过一些类似的问题,但没有什么非常具体的问题,而且作为一个新的 Clojure 开发人员并不确定其中任何一个是否是最佳实践。

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

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

【问题讨论】:

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

标签: asynchronous concurrency clojure


【解决方案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)))))

这个 sn-p 将运行max 次,并且在每次迭代中它会启动一个线程(在这种情况下)只是将一些内容打印到控制台。届时将 睡一秒钟。我刚刚添加了 max 参数用于测试目的,如果你愿意,可以省略它。

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

另外,也许真的不需要在单独的线程中进行数据库处理,我只是在主线程上运行它。但这取决于你。

【讨论】:

    【解决方案2】:

    这取决于您希望应用程序如何。你可以让他有一个石英调度程序,并有工作来进行查询。由于应用程序需要每秒查询 db 左右,所以要有 db pooling。您可以使用期货来生成额外的工作线程。

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

    如果你想要一个分布式服务,你可以使用 onyx。同样,这取决于工作任务的复杂程度和用例。

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多