当前位置: 首页 > 知识库问答 >
问题:

优雅地退出Clojure Core.Async go循环在kill

施飞鸿
2023-03-14

我有一个顶级核心.异步运行循环。我想让它无限期地运行,至少直到我用CTRL-C或kill或类似的方式示意它停止。我当前正在使用java.lang.runtime/AddShutDownHook,如下所示:

(ns async-demo.core
  (:require [clojure.core.async :as async
             :refer [<! >! <!! timeout chan alt! go]]))
(defn run [] (go (loop [] (recur))))
(.addShutdownHook (Runtime/getRuntime) (Thread. #(println "SHUTDOWN")))

我想要的也不是。

我不一定期望找到一个适用于所有JVM的解决方案。我在Mac上开发并部署到Ubuntu上,所以我想找到一个同时适用于两者的解决方案:

>

  • Mac JVM:java版本“1.7.0_45”java(TM)SE运行时环境(build 1.7.0_45-B18)java HotSpot(TM)64位服务器VM(build 24.45-B08,混合模式)

  • 共有1个答案

    孟花蜂
    2023-03-14

    go函数返回一个通道。您可能希望在shutdown挂钩中使用(关闭!chan)

    如果在run中运行le,则需要一个main函数,该函数将调用(run)来启动go线程。

    (ns async-demo.core
      (:require [clojure.core.async :as async
                 :refer [<! >! <!! timeout chan alt! go close!]]))
    
    (def ch (atom nil))
    
    (defn run []
      (go (while true
            (<! (timeout 500))
            (prn "inside go"))))
    
    (defn -main [& args]
      (println "Starting")
      (reset! ch (run))
      (.addShutdownHook (Runtime/getRuntime)
                        (Thread. #(do
                                    (println "SHUTDOWN")
                                    (close! @ch))))
      (while true
        (<!! @ch)))
    

     类似资料:
    • 问题内容: 我发现几乎每个教程都告诉我针对事件循环执行此操作: 但是,单击X关闭程序会出现此消息。 这些示例建议使用无限循环,这的确使我感到奇怪。这听起来不自然,而我的其他X11程序也没有这样做。所以我四处搜寻。我发现了如何捕获窗口关闭事件。 那个有效。它退出没有错误。…但是我拒绝相信这是正常的做事方式。我的意思是,这是正确退出X11应用程序的唯一方法吗?捕获结束事件似乎需要做很多工作。如何进行“

    • 问题内容: 我正在阅读出色的在线书籍http://nodebeginner.org/,并尝试了简单的代码 现在我不知道(而且我仍然不知道!)如何优雅地关闭node.js,所以我就去了。现在,每次我尝试运行时,都会收到以下错误消息。 因此,有两个问题: 1)如何正常关闭node.js? 2)如何修复我创建的混乱? 问题答案: 使用+ 优雅地退出节点进程 清理混乱取决于您的平台,但基本上,您需要找到运

    • 相关zulip聊天 我正在试图弄清楚,在quarkus中启动应用程序时,您应该如何优雅地失败。 我尝试将其添加到应用程序启动代码中。如果我运行一个单元测试,现在就不会调用它。仅当我直接启动应用程序时才会调用它。我希望返回一个非零值,以防抛出异常。这可能是推荐的方法。我不确定 我不确定这是一个功能请求还是一个bug,或者我遗漏了什么,这是正常的行为。 编辑1:我想说清楚: 当我使用“/gradlew

    • 问题内容: 在下面的代码中,我希望循环在+ + =时立即退出。但是,使用语句进行测试表明它一直持续到循环完成为止。我尝试过,然后在语句集中进行设置,但这会导致无限循环。我认为使用然后设置可能有效,但也可以一直运行到循环结束为止。什么是最优雅,最快的退出方式?谢谢。 问题答案: 该循环将只匹配条件时,当控制返回到它,即循环完全执行。因此,这就是即使满足条件也不会立即退出程序的原因。 但是,如果条件没

    • 出现的问题是,当用户确实输入了一个正数时,它仍然忽略输入,并要求用户再次输入一个正整数。我想我只是没有正确退出循环,但我不确定是如何退出的。

    • 如果您能帮助我完成Java类的任务,我将不胜感激。问题提示如下: 编写一个程序来读取非负整数列表并显示最大整数、最小整数和所有整数的平均值。用户通过输入一个不用于查找最大值、最小值和平均值的负哨兵值来指示输入的结束。平均值应该是双精度类型的值,以便用小数部分计算。 我在代码中遇到的问题是,运行时,循环不会完成,除非输入的第一个值为负值,在这种情况下它返回: 输入的最大数字是:0输入的最小数字是:0