Nic*_*Dao 6 clojure core.async
我在这里读到了关于core.async这篇伟大的文章:
http://www.core-async.info/reference/primitives
我很难理解put的内部机制!去.我明白那个:
我不明白:
非常感谢你揭开那些神秘面纱.
Mic*_*zyk 11
如果你想了解core.async频道是如何工作的,那么没有比Rich Hickey的EuroClojure 2014演示文稿更好的来源:core.async频道的实现细节.
至于你的具体问题:
如果put!未立即接受,它把待处理的put(被放通道+上的值put!上内部的信道队列的回调).请注意,如果队列中没有空间,则会抛出异常(最大容量当前固定为1024).
如果(1)不立即接受put,或者(2)将explicit false作为put!调用的最后一个参数传入(调用此参数on-caller?,请参阅put!文档字符串以获取详细信息),将在池化线程上调用回调.
在go块的上下文中,"停放" 是指go通过记录其当前状态的某些细节并将它们保存在通道或可能的几个通道中来暂停执行块的状态机,以便以后可以重新启动它.(请注意,这种安排意味着如果所有持有对挂起go块的引用的通道都是GC,则go块本身也可以是GC.)在其他情况下,它同样指的是将控制线程置于暂停状态动画.put!仅仅是一个函数(当然,它是由一个协议方法的支持,但随后这仅仅是一个协议方法),这样的概念并不适用.
是.它基本上通过在代码步骤go块中,当控制到达一定的"定制端子"(可能是悬浮它<!,>!,alt!).
不一定,您应该首先考虑内部队列溢出的风险(参见上面的第1点).