Asynchronous 在go块无限期执行时防止程序终止?

Asynchronous 在go块无限期执行时防止程序终止?,asynchronous,clojure,core.async,Asynchronous,Clojure,Core.async,我编写了一个独立的uberjar,其中包含一个main方法,它派生出两个go块,如下所示: (defn -main [& args] (let [c (chan)] (go (while true (>! c (rand)))) (go (while true (<! c))))) (defn-main[&args] (让[c(chan)] (虽然是真的 (>!c(rand))) (虽然是真的 ( 但当我执行程

我编写了一个独立的uberjar,其中包含一个main方法,它派生出两个go块,如下所示:

(defn -main [& args]
  (let [c (chan)]
    (go (while true
           (>! c (rand))))
    (go (while true
           (<! c)))))
(defn-main[&args]
(让[c(chan)]
(虽然是真的
(>!c(rand)))
(虽然是真的
(
但当我执行程序时,它很快就会终止。为什么?我的目的是让go块无限期地执行。我最终还是坚持了

 (<!! (chan))
(

在主函数的末尾防止终止。有更好的方法吗?

程序终止,因为在创建了那些
go
块之后,主函数就完成了。无需做任何事情,它就退出了;这应该不会太令人惊讶。当然,我们更希望主应用程序在所有这些块都不运行的情况下继续运行软管
go
块仍处于活动状态

每个
go
块都会生成一个通道;您可以等到其中一个返回某个内容(尽管就目前而言,它们永远不会返回)。尝试在它们旋转时使用阻塞:

(defn -main
  [& args]
  (let [c (chan)]
    (alts!!
      [(go (while true
             (>! c (rand))))
       (go (while true
             (<! c)))])))
或者,进入疯狂状态,一秒钟后超时:

(defn -main
  [& args]
  (let [c (chan)]
    (alts!!
      [(go (while true
             (>! c (rand))))
       (go (while true
             (<! c)))
       (timeout 1000)])))
(defn-main
[&args]
(让[c(chan)]
(alts!!
(虽然是真的
(>!c(rand)))
(虽然是真的
(

更大的好处是,您很有可能希望阻止主线程,等待那些异步
go
块完成其业务。

所以没有办法干净地退出您的应用程序?我依赖于Ctrl+C。@AustinC:这正是您的问题。当您使用infin设计异步数据流时在分派循环中,您需要自己的取消条件。在
core.async
中,通常通过在生产者端调用
close!
将取消从生产者传递给消费者,然后在消费者端分派
nil
。以下是一些示例代码:
(defn -main
  [& args]
  (let [c (chan)]
    (alts!!
      [(go (while true
             (>! c (rand))))
       (go (while true
             (<! c)))
       (timeout 1000)])))