Don*_*all 4 clojure core.async
当我编写更多core.async代码时,出现的一个非常常见的模式是一个go-loop,它会在一系列通道上发生变化,并且会响应一条消息而做一些工作,例如:
(go-loop [state {}]
(let [[value task] (alts! tasks)]
...work...
(recur state))
Run Code Online (Sandbox Code Playgroud)
我不觉得我理解我可以实际工作的各种方式的权衡,所以我想我会尝试在这里探讨它们.
这个摘要是正确和全面的吗?
如果要完成的工作完全是CPU绑定的,那么我可能会在go块中内联,除非它是一个可能需要很长时间的操作,我希望go块继续响应其他消息.
通常,任何不阻塞,休眠或进行I/O的工作都可以安全地放入go块中,而不会对系统的吞吐量产生重大影响.
您可以使用>!将工作提交给工人或工作人员池.我几乎不会>!!在一个go块中使用,因为它可以阻止分配给运行go块的有限数量的线程之一.
当您需要执行I/O或可能长时间运行的计算时,请使用a thread而不是a go.这非常相似future- 它创建了一个真正的线程 - 但它返回一个类似的通道go.
put!是一种较低级别的操作,通常用于core.async的"边界",以将其连接到传统的基于回调的接口.put!里面几乎没有任何理由可以使用go.
core.async可以支持对线程创建方式的细粒度控制.我在博客文章" 使用core.async进行并行处理"中展示了一些可能性.