gpt4 book ai didi

multithreading - Akka:如何确保已收到消息?

转载 作者:行者123 更新时间:2023-12-03 13:11:34 25 4
gpt4 key购买 nike

我有一个 Actor 分配器。它是做什么的

  • 通过请求
  • 分配一些对象
  • 听新来的人

  • 代码如下
    class Dispenser extends Actor {
    override def receive: Receive = {
    case Get =>
    context.sender ! getObj()
    case x: SomeType =>
    addObj(x)
    }
    }

    在实际处理中,自从发送新对象开始直到分配器开始分配它已经过了1毫秒甚至几秒钟,都没有关系,因此没有代码跟踪它。

    但是现在我正在为分配器编写测试,并且我想确保首先接收新对象,然后才接收Get请求。

    这是我想出的测试代码:
    val dispenser = system.actorOf(Props.create(classOf[Dispenser]))
    dispenser ! obj
    Thread.sleep(100)
    val task = dispenser ? Get()
    val result = Await.result(task, timeout)
    check(result)

    它满足了一项重要要求- 不会更改原始代码。但它是
  • 即使在非常高性能的盒子上,也至少要慢100ms秒
  • 不稳定,有时会失败,因为100毫秒或任何其他常量不提供任何保证。

  • 问题是 ,如何进行满足要求且在以上没有缺点的测试(其他任何明显的缺点)

    最佳答案

    您可以取出Thread.sleep(..),然后测试就可以了。 Akka保证您需要的订购。

    用代码

    dispenser ! obj
    val task = dispenser ? Get()
    dispenser将确定性地先处理 obj,因为
  • 同一线程将Get然后obj放置在actor的邮箱中,因此它们在actor的邮箱
  • 中的顺序正确
  • Actor依次处理和一次处理消息,因此Actor会接收到这两条消息,并按照它们在邮箱中排队的顺序进行处理。

  • (..如果没有其他事情发生在您的示例代码中-路由器,getObj或addObj中的异步处理,隐藏,..)

    关于multithreading - Akka:如何确保已收到消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30916728/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com