我试图实现一个A/B测试机制,使用Akka演员(scala 2.12.8
,akka演员类型2.6.1
)
我把它设计成:
当A/B测试参与者收到消息时,它将选择一个变体并将消息转发给它。
然而,直到现在,我还没有设法让根演员产生它的孩子。这是我的密码。
import akka.actor.typed.{ActorRef, ActorSystem, Behavior}
import akka.actor.typed.scaladsl.{AbstractBehavior, ActorContext, Behaviors}
import scala.util.Random
// My variants
object Ranker {
sealed trait Command
final case class Rank() extends Command
def apply(rank: Int): Behavior[Command] = Behaviors.setup { context => new Ranker(context, rank) }
}
class Ranker(context: ActorContext[Ranker.Command], rank: Int) extends AbstractBehavior[Ranker.Command](context) {
override def onMessage(msg: Ranker.Command): Behavior[Ranker.Command] = {
println(rank)
this
}
}
// The root A/B Testing actor
object ABTester {
def apply(): Behavior[Ranker.Command] = Behaviors.setup { context => new ABTester(context) }
}
class ABTester(context: ActorContext[Ranker.Command]) extends AbstractBehavior[Ranker.Command](context) {
val rng = new Random()
// Spawn children actors
val rankers: Seq[ActorRef[Ranker.Command]] = Seq(Ranker(1), Ranker(2)).zipWithIndex
.map { case (b, i) =>
println(s"Spawning ranker $i")
val actorRef = context.spawn(b, s"Ranker $i")
println(s"Spawning ranker $i: Done")
actorRef
}
override def onMessage(msg: Ranker.Command): Behavior[Ranker.Command] = {
rankers(rng.nextInt(rankers.size)) ! msg
this
}
}
// Application entry point
object Main {
def main(args: Array[String]): Unit = {
val actor = ActorSystem(ABTester(), "ABTester")
actor ! Ranker.Rank()
Thread.sleep(5000)
}
}
运行此示例将打印:
Spawning ranker 0
但仅此而已,好像第31行(val actorRef=context.spawn(b,s"Ranker$i")
)永远不会返回...
我是否错过了一些关于儿童演员繁殖的事情?
Actor paths MUST:
not start with `$`,
include only ASCII letters
and can only contain these special characters: -_.*$+:@&=,!~';.`
我终于发现了错误!
我没有正确设置日志记录,因此错误消息从未出现。添加slf4j simple
依赖项后,会发生以下情况:
[ABTester-akka.actor.default-dispatcher-3] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
SLF4J: A number (1) of logging calls during the initialization phase have been intercepted and are
SLF4J: now being replayed. These are subject to the filtering rules of the underlying logging system.
SLF4J: See also http://www.slf4j.org/codes.html#replay
[ABTester-akka.actor.default-dispatcher-3] INFO ABTester - Spawning ranker 0
[ABTester-akka.actor.default-dispatcher-3] ERROR akka.actor.LocalActorRefProvider(akka://ABTester) - guardian failed, shutting down system
akka.actor.InvalidActorNameException: Invalid actor path element [Ranker 0], illegal character [ ] at position: 6. Actor paths MUST: not start with `$`, include only ASCII letters and can only contain these special characters: -_.*$+:@&=,!~';.
at akka.actor.ActorPath$.validatePathElement(ActorPath.scala:98)
at akka.actor.ActorPath$.validatePathElement(ActorPath.scala:76)
at akka.actor.dungeon.Children.checkName(Children.scala:248)
at akka.actor.dungeon.Children.actorOf(Children.scala:47)
at akka.actor.dungeon.Children.actorOf$(Children.scala:46)
at akka.actor.ActorCell.actorOf(ActorCell.scala:408)
at akka.actor.typed.internal.adapter.ActorRefFactoryAdapter$.spawn(ActorRefFactoryAdapter.scala:41)
at akka.actor.typed.internal.adapter.ActorContextAdapter.spawn(ActorContextAdapter.scala:66)
at ABTester.$anonfun$rankers$1(ABTester.scala:31)
[...]
演员路径(传递给spawn
方法)不能包含任何空格。
从Ranker$i
更改为Ranker\u$i
会导致:
[ABTester-akka.actor.default-dispatcher-3] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
[ABTester-akka.actor.default-dispatcher-6] INFO ABTester - Spawning ranker 0
[ABTester-akka.actor.default-dispatcher-6] INFO ABTester - Spawning ranker 0: Done
[ABTester-akka.actor.default-dispatcher-6] INFO ABTester - Spawning ranker 1
[ABTester-akka.actor.default-dispatcher-6] INFO ABTester - Spawning ranker 1: Done
[ABTester-akka.actor.default-dispatcher-3] INFO Ranker - rank: 2
本文向大家介绍render在什么时候会被触发?相关面试题,主要包含被问及render在什么时候会被触发?时的应答技巧和注意事项,需要的朋友参考一下 在 React 中,只要执行了 setState 方法,就一定会触发 render 函数执行; 组件的 props 改变了,不一定触发 render 函数的执行,除非 props 的值来自于父组件或者祖先组件的 state
问题内容: 我有一个设置为启动Java活动(称为MyJavaActivity)的android应用,这反过来又会启动NativeActivity。NativeActivity完成后,它将返回到MyJavaActivity。 我还有一个Java单例类(称为MyJavaSingleton),我希望在应用程序的整个生命周期中都将其保留在内存中。我从NativeActivity(使用JNI)中设置了一些单
问题内容: 我是一名即将毕业的计算机科学专业的学生,在我的整个编码生涯中,我发现很少使用枚举的实例,除了典型的情况(例如代表标准纸牌的面孔)外,还使用了枚举。 您是否知道在日常编码中使用枚举的任何巧妙方法? 为什么枚举如此重要,在什么情况下应该能够确定建立枚举是最佳方法? 问题答案: 这些是主要的论点,以及短的例子。 的情况 从Java 6开始,是一个凌乱类的示例,该类可以从使用中受益匪浅(除
我有一个Android应用程序,每个屏幕分辨率包含大约150个图标。 如果我把所有图标放在所有5个主要分辨率(ldpi、mdpi、hdpi、xhdpi、xxhdpi)中,那么图标总数将达到750个。这有几个缺点: 大APK大小 将dexGuard与ant构建脚本一起使用时构建过程缓慢。它对图像进行一些处理需要一些时间。 或者,我可以只在一些分辨率中放置图标。例如,ldpi设备现在仅占市场的10%,
问题内容: 我正在尝试通过对象读取命令。为了检查输入语法,我使用了(对于缺少命令的情况)。在许多情况下,它确实可以正常工作,但是现在我有了JavaAPI中描述为“ MAY块并等待输入”的情况。 该方法什么时候阻止,我该如何控制?有趣的是,在块之前有3个案例,它工作得很好。另外,JavaAPI还描述了检查是否存在另一个Input的正确方法,以使该Method 不会产生。 这是我到目前为止所产生的代码
我正在尝试通过对象读取命令。为了检查输入语法,我使用<code>sc。hasNext()(对于缺少命令的情况)。它已经在很多情况下运行良好,但现在我看到了JavaAPI中描述的“MAY block and wait for Input”的情况。 方法何时阻塞,我如何控制它?有趣的是,在街区前的3个案例中,它工作得非常好。此外,JavaAPI还将描述为检查是否存在另一个Input的正确方法,从而使方