通过 actor 选择向所有 children 转发消息是否比遍历 child ActorRefs 更有效?

Is forwarding a message to all children via an actor selection more efficient than iterating over the child ActorRefs?

我有一个场景,当一个演员收到一条特定的消息时,它必须将该消息转发给当时存在的所有children。

我想我有 2 个选项可以解决这个问题。

getContext().actorSelection("*").forward(message, getContext());

getContext().getChildren().forEach(child -> child.forward(message, getContext()));

如果不完全理解 actor 选择的内部实现,就很难知道哪个表现更好。我计划以我期望的那种规模执行一些基准测试,但希望有经验的用户对此有任何见解。

谢谢

我没有对它进行基准测试,但我一直在寻找这两个选项的实现。两者在性能方面应该非常相似,因为它们最终使用可迭代的 actor 引用。

另一方面,您可以 check 字符串“*”被翻译成一个表达式,并且 actorSelection 中的转发将只匹配该表达式与演员的 children,然后将消息转发给每个匹配的 children.

matchingChildren.foreach(_.tell(sel.msg, sender))

并在需要时递归执行此操作(例如在“*/*”中)。

所以我建议使用 getChildren 来避免解析字符串 ("*") 的重载,将其转换为正则表达式,并过滤匹配 children.