一般来说,我们想避免阻塞 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 和使内部操作无需副作用。