【发布时间】:2011-01-13 14:15:05
【问题描述】:
我正在用 Scala 编写一个实用程序,其中包括一个“文件复制”角色。我发送要复制的文件名,然后演员一次复制一个。
如何在 Clojure 中使用代理做同样的事情?
【问题讨论】:
-
您可能对此stack-exchange proposal 感兴趣。它几乎可以开始测试了,只需要更多。
我正在用 Scala 编写一个实用程序,其中包括一个“文件复制”角色。我发送要复制的文件名,然后演员一次复制一个。
如何在 Clojure 中使用代理做同样的事情?
【问题讨论】:
为什么需要使用代理来执行此操作?因为你想异步复制它们?但是如果你仍然想这样做,你可以使用类似的东西:
(do-all (for [x file-names] (send-off agent-name copy-function x)))
虽然,也许使用期货更好?
【讨论】:
future 会使复制异步进行,便于阻止每个文件(或您可能要等待的特定文件),并允许所有多个副本立即进行(这可能是也可能不是您想要的)。向单个代理发送多次会使复制操作排队,因此任何时候都只会发生一次。
future 假定文件副本之间没有交互,或者所有此类交互都是线程安全的(如果复制依赖于 Java 互操作,则可能不是)。使用 Actor/Agent 不会做出这样的假设,因为副本是按顺序制作的,只是与发送者不在同一个线程中。