如何处理无限循环
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
作为一个爱好项目,我正在研究 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