【问题标题】:Use akka actors to traverse directory tree使用akka actor遍历目录树
【发布时间】:2016-12-02 15:02:44
【问题描述】:
我是演员模型的新手,正在尝试编写一个简单的示例。我想使用 Scala 和 Akka 遍历目录树。程序应该找到所有文件并对每个文件执行任意(但快速)操作。
我想检查如何使用演员对递归进行建模?
遍历完成时如何优雅地停止actor系统?
如何控制演员的数量以防止内存不足?
有没有办法让演员的邮箱不会变得太大?
如果文件操作需要很长时间执行会有什么不同?
任何帮助将不胜感激!
【问题讨论】:
标签:
scala
recursion
directory
akka
actor
【解决方案1】:
- 演员是工人。他们接受工作并反馈结果,或者他们监督其他工人。通常,您希望演员承担单一责任。
- 理论上,您可以有一个actor来处理目录的内容,处理每个文件,或者为遇到的每个目录生成一个actor。这会很糟糕,因为文件处理时间过长会使系统停止运行。
- 有几种方法可以优雅地停止 Actor 系统。 Akka 文档中提到了其中的几个。
- 您可以有一个 Actor 主管,它将对 Actor 的请求排队,如果低于 Actor 阈值计数,则生成 Actor,并在 Actor 完成时减少计数。这是监督演员的工作。监督演员可以在监控时坐在一侧,也可以分派工作。 Akka 有 Actor 模型来实现这两种方法。
- 是的,有几种方法可以控制邮箱的大小。阅读文档。
- 如果您以错误的方式执行文件操作,例如简单的递归遍历,文件操作可能会阻塞其他处理。
首先要注意的是有两种类型的工作:遍历文件层次结构和处理单个文件。作为您的第一个实现尝试,创建两个参与者,参与者 A 和参与者 B。参与者 A 将遍历文件系统,并向参与者 B 发送消息以及要处理的文件的路径。当参与者 A 完成时,它会向参与者 B 发送“全部完成”指示符并终止。当参与者 B 处理“全部完成”指示符时,它终止。这是一个基本实现,您可以使用它来学习如何使用演员。
其他一切都是这个的变体。下一个变体可能是创建两个具有共享邮箱的参与者 B。关机有点复杂,但仍然很简单。下一个变体是创建一个调度员actor,它将工作分包给一个或多个actor B。下一个变体使用多个参与者 A 来遍历文件系统,并由主管控制创建的参与者数量。
如果你遵循这个开发计划,你将会学到很多关于如何使用 Akka 的知识,并且可以回答你所有的问题。