我已经使用core.async一段时间了,但是避免了pub
和mult
,因为我无法从他们的文档中真正掌握一个有用的用例。
具体说明topic-fn
的目的是什么?你将如何在实践中使用它?
或许你可以将理论解释映射到下面的虚构方法。我认为这有助于了解它在实践中的运作方式(如果适用的话)?
虚拟方法解释:
可以有几种不同的视图来表示状态。为了让他们采取行动并响应状态变化,我希望有几个渠道(在应用程序级别上),例如 - 专用于状态更改和用户输入(如按键)。
每个视图都应该能够(划线)?到此应用程序通道,以便它们可以独立地对更改做出反应。此外,每个视图都应该可以{em>状态通道上的put
(但不是用户输入-chan)。
答案 0 :(得分:21)
core.async中的频道是单播,单拍。也就是说,任何进入的消息都只给予一个接受者。这在广播情况下效果不佳,其中许多去块需要将每个消息的副本放入频道,然后您需要其他内容。这就是mult有用的东西。 Mult也可能被称为“广播”
然后Pub就是mult + multimethods。 topic-fn是应用于每个输入项的函数。函数的输出决定了消息的主题。然后,输入消息仅广播给正在收听该主题的订户。
更多信息请参阅我上次Conj的演讲中的注释,可在此处获取:https://github.com/halgari/clojure-conj-2013-core.async-examples/blob/master/src/clojure_conj_talk/core.clj#L398