【问题标题】:core.async channel as an atomcore.async 通道作为原子
【发布时间】:2018-01-29 02:36:43
【问题描述】:

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

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

当在 STDIN 上使用文件运行时,我的代码会创建一个通道、创建消费者并将行放入通道。当我进行交互时,我想我会创建一个通道并将其绑定到一个原子;那么将有一个 API 暴露来将单个消息添加到通道,或者整个序列,没关系。

让我怀疑这个决定的原因是没有讨论通道+原子组合的示例/文章。好像这不是一个好的模式。 有人可以提供他们的意见吗?也许我只是想多了=) 对文字墙感到抱歉!

【问题讨论】:

  • 猜你是对的。

标签: clojure core.async


【解决方案1】:

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

我猜你想推迟初始化通道,并在决定需要通道时reset!原子。虽然这可行,但我认为这是对原子的滥用。

我建议只使用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 初始化原子,然后在使用它之前不断检查原子是否添加了通道。

【讨论】:

  • 这正是我所做的;谢谢,我不知道“延迟”,猜我从 Clojure 的休息时间太长了。
【解决方案2】:

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

在 .clj 文件的末尾找到一个注释表单并不少见,其中包含旨在在 REPL 进行评估的帮助程序。例如:

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

【讨论】:

  • 我也喜欢这个主意;在这次重新引入练习之后,我当然对 Clojure 感到更加自在。但这里的缺点是,用户需要说 core.async :)
猜你喜欢
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
相关资源
最近更新 更多