【问题标题】:Actors in ClojureClojure 中的演员
【发布时间】:2011-01-13 14:15:05
【问题描述】:

我正在用 Scala 编写一个实用程序,其中包括一个“文件复制”角色。我发送要复制的文件名,然后演员一次复制一个。

如何在 Clojure 中使用代理做同样的事情?

【问题讨论】:

标签: clojure actor


【解决方案1】:

为什么需要使用代理来执行此操作?因为你想异步复制它们?但是如果你仍然想这样做,你可以使用类似的东西:

(do-all (for [x file-names] (send-off agent-name copy-function x)))

虽然,也许使用期货更好?

【讨论】:

  • 我认为代理的意义在于它们保持某种状态,可以通过传递一个函数来改变。我猜如果你不关心前一个值,而只是想用代理做一些异步工作,你可以传递一个忽略前一个值的复制函数。
  • 是的,当然 - 您可以将一些状态数据存储到代理中
  • 如果您不打算在代理中存储状态,那么最好使用未来异步完成工作。
  • 对每个要复制的文件使用future 会使复制异步进行,便于阻止每个文件(或您可能要等待的特定文件),并允许所有多个副本立即进行(这可能是也可能不是您想要的)。向单个代理发送多次会使复制操作排队,因此任何时候都只会发生一次。
  • 使用 future 假定文件副本之间没有交互,或者所有此类交互都是线程安全的(如果复制依赖于 Java 互操作,则可能不是)。使用 Actor/Agent 不会做出这样的假设,因为副本是按顺序制作的,只是与发送者不在同一个线程中。
猜你喜欢
  • 2020-04-15
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 2013-05-19
  • 2019-04-23
  • 2011-02-20
相关资源
最近更新 更多