如何处理无限循环

How to handle infinite go-loops

作为一个爱好项目,我正在研究 alternate futures and promises implementation based on "From Events to Futures and Promises and back". The original author uses channels/events under the hood, which is why I am using core.async. A future, expressed in pseudo Go 语法,如下所示:

func future(func f() (T, bool)) Future <T> {
    ch = newChannel ()
    spawn(func() {
        x := f()
        for { syncEvt(sndEvt(ch, x)) }
    })
    return rcvEvt(ch)
}

使用有效的 Go 语法、类型定义和 get 函数:

type Comp struct {
    value interface{}
    ok    bool
}

type Future chan Comp

func future(f func() (interface{}, bool)) Future {
    future := make(chan Comp)

    go func() {
        v, o := f()
        c := Comp{v, o}
        for {
            future <- c
        }
    }()

    return future
}

func (ft Future) get() (interface{}, bool) {
    c := <-ft
    return c.value, c.ok
}

现在,当我将其移植到 Clojure 时,我正在考虑按如下方式实现它:

(defrecord Comp [value ok])

(defn future [f]
  (let [future (chan)]
    (go-loop [comp (f)]
      (>! future comp)
      (recur comp))
    future))

(defn get [future]
  (<!! future))

由于我是 Clojure 的新手(core.async),我担心无限 go-loop。 IOC 线程会被释放吗?我是否应该提供某种毒丸来停止循环(尽管我认为这很容易出错)?有什么建议吗?

Go Clojure 中的块与 Go 中的不同。在 core.async 中,go 块作为附加到通道的回调存在,因此它们与通道本身存在的时间一样长。因此,将 go 块视为回调的语法糖,它会变得有意义。

此视频教程更详细一些:https://www.youtube.com/watch?v=VrwVc-saWLw