core.async通道作为原子

时间:2018-01-29 02:36:44

标签: clojure core.async

我正在构建一个使用文件的应用程序,并生成另一个文件。它的作用并不是非常重要,但我想使用core.async;主要原因是我想学习它,但也能够在多核机器上更快地进行这种处理。

我希望应用程序有两种操作模式:您可以从命令行运行它,并在STDIN上传递文件,或者您可以启动REPL会话,并在那里创建您的输入。我已经在我的Emacs REPL中使用了这种方法,我希望能够在命令行REPL会话中使用。

当在STDIN上运行文件时,我的代码会创建一个频道,创建消费者,并将这些行放到频道上。当我进行互动时,我想我会创建一个通道并将其绑定到原子上;然后会有一个API暴露给频道添加单个消息,或整个序列,并不重要。

是什么让我怀疑这个决定是没有关于频道+原子组合的例子/文章。好像它不是一个好的模式。 有人能提供他们的意见吗?也许我只是过度思考这个=) 对于文本墙感到抱歉!

2 个答案:

答案 0 :(得分:2)

我看不到将可变对象放在原子中有什么好处。原子的目的是充当不可变对象的可变容器。

我猜你想要暂停初始化频道,并在确定需要频道时reset!原子。{1}}虽然这有效,但我认为它是滥用原子。

我建议只使用delay

(def ch (delay (chan)))

; The chan is initialized here the first time it's dereferenced
@ch

; And the same cached chan is used here
@ch

这使您无需使用nil初始化原子,然后在使用之前不断检查原子是否已添加通道。

答案 1 :(得分:0)

更好的方法是在REPL上简单地评估(def c (chan))。然后你可以根据需要传递/检查c,但不能改变程序的结构。

在.clj文件的末尾找到一个评论表并不常见,其中包含要在REPL评估的帮助程序。例如:

(comment
  (def c (chan))
  (do-something-with-c c))