我在这里阅读了关于core.async这篇伟大的文章:
http://www.core-async.info/reference/primitives
我很难理解put的内部机制!去。我理解:
我不明白:
非常感谢能够揭开这些神秘面纱。
答案 0 :(得分:8)
如果你想了解core.async频道是如何运作的,那么Rich Hickey的2014年EuroClojure演示文稿就没有更好的资源了:Implementation details of core.async channels。
至于你的具体问题:
如果不立即接受put!
,它会在通道内部的队列上放置待处理的放置(要放在通道上的值+ put!
回调)。请注意,如果队列中没有空间,则会抛出异常(最大容量当前固定为1024)。
如果(1)未立即接受put,或者(2)将false
作为put!
调用的最终参数传入({1}},则将在池化线程上调用回调(此参数名为on-caller?
,有关详细信息,请参阅put!
的文档字符串。)
在go
块的上下文中,“停放”是指通过记录其当前状态的某些细节并将其保存在通道内来暂停执行go
块的状态机,或者可能是几个通道,以便以后可以重新启动。 (请注意,这种安排意味着如果所有持有对已挂起的go
块的引用的通道都是GC,那么go
块本身也可以是GC。)在其他情况下,它同样指的是将控制线程置于假死状态。 put!
只是一个函数(好吧,它由协议方法支持,但 只是一种协议方法),所以这个概念不适用。
是。它基本上会逐步执行go
块中的代码,当控件到达某些“自定义终端”时可能会暂停它(<!
,>!
,alt!
)。
不一定,您应该首先考虑内部队列溢出的风险(见上文第1点)。