通常,我们希望避免阻塞IO并使其变为非阻塞。假设我们通过一个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))
...))
再次,可以在其他功能(比如last-fn
)中使用send-welcome-email
,然后我们需要另一个go
块。因此,我们创建了一个使用go
(就像原始功能一样)的函数链。
然后,如果调用last-fn
,必须逐一创建几个go
块。
我的问题是:这是否是使用go
的正确方式?或者我的问题可能是不正确的。
我很担心,因为这似乎意味着要执行一个函数,我们需要创建多个go
(然后是通道)并收集它们。这某种程度上显得不够优雅。我不太理解core.async
,但我相信go
可以用于非阻塞IO。另一方面,如果我们把go
看作一个状态机,那么我们应当避免在go
中进行IO,并让事情内部无副作用。