Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 使用ExActor的长生不老药根据情况有没有冬眠的方法_Elixir - Fatal编程技术网

Elixir 使用ExActor的长生不老药根据情况有没有冬眠的方法

Elixir 使用ExActor的长生不老药根据情况有没有冬眠的方法,elixir,Elixir,我目前正在学习长生不老药来开发一个拍卖网站。因此,每次拍卖我都有一个工作程序,当工作程序启动时,它可能会立即进入休眠状态,但在拍卖结束前的最后N分钟内,我不希望我的工作程序在每次收到出价时都处于休眠状态(如果我错了,请告诉我,但这可能没有效率) 我已经开始使用基本GenServer OTP(handle_call,handle_info…)进行开发,我正在使用ExActor和Fsm(均来自Saša Jurić)进行重构,并尝试应用CQRS/ES 有没有一种方法可以使用ExActor实现这一点,而

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

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

有没有一种方法可以使用ExActor实现这一点,而不返回到处理所谓的“基础”

我希望实现类似以下目标:

{:reply,…}
当距离拍卖结束还有不到10分钟时


{:reply,…,:hibernate}
当距离拍卖结束还有10分钟以上时。

在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

附言。 您可能对有关的文章感兴趣