使用akka actors遍历目录树

时间:2016-12-02 15:02:44

标签: scala recursion directory akka actor

我是演员模特的新手并试图写一个简单的例子。我想使用Scala和Akka遍历目录树。程序应该找到所有文件并对每个文件执行任意(但快速)的操作。

我想检查一下如何使用actor对递归进行建模? 遍历完成后,如何优雅地停止演员系统? 如何控制演员数量以防止内存不足? 有没有办法让演员的邮箱变得太大? 如果文件操作需要很长时间才能执行,会有什么不同?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

  1. 演员是工人。他们接受工作并给予结果,或者他们监督其他工人。一般来说,你希望你的演员有一个责任。
  2. 理论上,您可以让一个actor处理目录的内容,处理每个文件,或者为遇到的每个目录生成一个actor。这样做会很糟糕,因为文件处理时间过长会使系统停滞不前。
  3. 有几种方法可以优雅地停止actor系统。 Akka文档中提到了其中几个。
  4. 你可以让一个演员管理员对演员的请求进行排队,如果低于演员门槛计数则产生演员,并在演员完成时减少计数。这是主管演员的工作。主管演员可以在监控时坐到一边,也可以派遣工作。 Akka让演员模仿了这两种方法的实现。
  5. 是的,有几种方法可以控制邮箱的大小。阅读文档。
  6. 如果您以错误的方式执行此操作,文件操作可能会阻止其他处理,例如天真的递归遍历。
  7. 首先要注意的是有两种类型的工作:遍历文件层次结构和处理单个文件。作为第一个实现尝试,创建两个actor,actor A和actor B. Actor A将遍历文件系统,并使用要处理的文件的路径向actor B发送消息。当演员A完成时,它向演员B发送“全部完成”指示并终止。当演员B处理“全部完成”指示符时,它终止。这是一个基本实现,可用于学习如何使用actor。

    其他一切都是对此的变异。下一个变体可能是创建两个带有共享邮箱的actor B.关机有点复杂,但仍然很简单。下一个变体是创建一个调度员演员,将一个或多个演员B的工作分配出去。下一个变体使用多个actor A来遍历文件系统,主管可以控制创建的actor数量。

    如果您遵循此开发计划,您将学到很多关于如何使用Akka的知识,并且可以回答您的所有问题。