gpt4 book ai didi

java - 在 kill 时优雅地退出 Clojure core.async go 循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:02:30 25 4
gpt4 key购买 nike

我有一个顶级 core.async去循环。我希望它无限期地运行,至少直到我用 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")))

这是我的问题:

  1. 如果我启动 REPL 和 (run),它就会启动并在后台线程中运行。当我退出 REPL 时,我没有看到所需的关闭消息。

  2. 但是,当我从 lein run 运行时,go 循环立即退出并显示“SHUTDOWN”。

这都不是我想要的。

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

  • Mac JVM:Java 版本“1.7.0_45”Java(TM) SE 运行时环境(内部版本 1.7.0_45-b18)Java HotSpot(TM) 64 位服务器虚拟机(内部版本 24.45-b08,混合模式)

  • Ubuntu JVM:Java 版本“1.7.0_25”OpenJDK 运行时环境 (IcedTea 2.3.10) (7u25-2.3.10-1ubuntu0.12.04.2) OpenJDK 64 位服务器 VM(build 23.7-b01,混合模式)

最佳答案

您可以使用信号 exit-ch 并执行条件判断是否应该退出循环。 channel + 条件在 clojure 中由 alt! 更好地处理:

(ns async-demo.core
(:require [clojure.core.async :refer [chan go-loop alt! timeout put!]]))

(defn run
[]
(let [exit-ch (chan)]
(go-loop []
(alt!
(timeout 10) (recur)
exit-ch nil
exit-ch

(let [exit-ch (run)]
(.addShutdownHook (Runtime/getRuntime) (put! exit-ch true)))

如果您只是关闭! channel ,它不会停止循环运行。另外,don't need to start a go block just to send a value to a channel .

关于java - 在 kill 时优雅地退出 Clojure core.async go 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20485188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com