在 Elixir 中创建在每个给定时间滴答的前台进程的最佳方法是什么?
我的主要问题是这样的方法:
defmoulde Ticker do
def tick do
do_something()
:timer.sleep(1000)
tick
end
end
有效,但设计上是错误的。它绝对不是每秒都在滴答作响,而是每秒加上 do_something() 完成的时间。
我可以产生一个处理“某事”的过程,但仍然有一个小的滞后。
此外,我正在尝试构建一个混合应用程序,其中涉及一些 GenServer,以及一个应该每 x 秒调用一次服务器的主前台进程(我在这里问的那个)。有这样做的otp方式吗?
最佳答案
如果您更喜欢发送消息而不是在给定的时间间隔调用函数,您可以使用 :timer.send_interval/3
例如。如果您想向 GenServer
发送消息正如OP在他们的回答中提到的那样,您可以每秒执行以下操作:
:timer.send_interval(:timer.seconds(1), target_pid, :tick)
在哪里 target_pid
是 GenServer
的 PID你想向其发送消息。然后您可以在 GenServer
中处理此消息像这样:def handle_info(:tick, state) do
do_something()
{:noreply, state}
end
关于elixir - 如何用elixir创建事件发射器,otp方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31410212/