一般来说,我们希望避免阻塞 I/O 并将其改为挂起。例如,我们可以通过一个go
块将保存到数据库的操作变为非阻塞。
(defn save-user-info [user]
(go (...)))
现在,如果我想使用这个函数,我想在go
块中调用它,因为我不想进行阻塞。
(defn register-user [user other-info]
(go (validate-user ...)
...
(<! (save-user-info user))))
save-user
和register-user
函数可以在许多地方使用,然后我们需要另一个go
块。
(defn send-welcome-email [user params]
(go ...
(<! (register-user user))
...))
同样,send-welcome-email
可以在其他函数(比如last-fn
)中使用,然后我们需要另一个go
块。因此,我们通过使用go
创建了一个函数链,其中“原始”函数也已经这样做。
然后,如果我们调用last-fn
,我们必须一次创建几个go
块。
我的问题是:这是否是使用go
的接受/正确方式?或者我的问题有误。
我担心因为似乎为了执行一个函数,我们需要创建几个go
(然后是通道)并执行垃圾回收。这在某种意义上并不优雅。我对core.async的理解还不够深入,但相信go
是用来使I/O非阻塞的。另一方面,如果我们将go
视为状态机,那么似乎我们应该避免在go
中进行I/O,并使内部操作无副作用。