【问题标题】:Elixir using ExActor is there a way to hibernate depending on conditions使用 ExActor 的 Elixir 是否可以根据条件休眠
【发布时间】:2016-04-22 01:58:03
【问题描述】:

我目前正在学习 Elixir 来开发一个拍卖网站。因此,每次拍卖我都有一个工作人员,当工作人员启动时,它可能会立即进入休眠状态,但是在拍卖结束前的最后 N 分钟内,我不希望我的工作人员在每次收到出价时都休眠(告诉如果我错了,但可能效率不高)。

我已经开始使用基本的 GenServer OTP(handle_call、handle_info ...)进行开发,我正在使用 ExActor 和 Fsm(均来自 Saša Jurić)进行重构,并尝试应用 CQRS/ES。

有没有办法使用 ExActor 来实现这一点,而不是回到 handle_call "basics" ?

我想实现类似于:

{:reply, ...} 距离拍卖结束还有不到 10 分钟。

{:reply, ..., :hibernate}距离拍卖结束还有 10 多分钟。

【问题讨论】:

    标签: elixir


    【解决方案1】:

    在 Erlang 中,休眠做了以下事情:

    • 丢弃进程调用堆栈
    • 进行垃圾回收
    • 之后,进程内存可能会减少到低于最小堆大小的值
    • 进程唤醒消息(如果邮箱中有消息,则立即唤醒)
    • 在唤醒时,有另一个垃圾回收,恢复正常进程大小

    休眠和唤醒占用大量 CPU 资源,并节省了非常少量的内存。我的建议是要么根本不使用它,要么进行一些性能测试,看看是否值得。如果您有数百万个拍卖进程并且它们很少收到新消息,则可能会增加一些内存,但不要指望有什么大不了的。

    您可以根据条件在休眠模式之间轻松切换。在普通的 OTP 中写这样的东西就足够了:

    case time_left > ten_minutes do
      true -> {:reply, new_state, :hibernate}
      false -> {:reply, new_state}
    end
    

    在 ExActor 中应该是:

    defcall your_funcion(args), state: state, do
      ...
      case time_left > ten_minutes do
        true -> set_and_reply(new_state, :hibernate)
        false -> set_and_reply(new_state, timeout)
      end
    end
    

    reply 这样的宏采用可选参数,即超时值或:hibernate atom。

    PS。 您可能对有关real time bidding in Erlang 的文章感兴趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2016-09-20
      • 2014-10-27
      • 2019-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多