elixir - 如何用elixir创建事件发射器,otp方式

标签 elixir erlang-otp eventemitter

在 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_pidGenServer 的 PID你想向其发送消息。然后您可以在 GenServer 中处理此消息像这样:
def handle_info(:tick, state) do
  do_something()
  {:noreply, state}
end

关于elixir - 如何用elixir创建事件发射器,otp方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31410212/

相关文章:

elixir - 在 Ecto 片段中使用表别名/查询表达式?

elixir - 将列表分成两等分 (±1)

erlang - 如何通过动态监督确定RestartStrategy

javascript - 在 ES6 类中使用 EventEmitter

javascript - "browser-external:events"中没有与导入 "EventEmitter"匹配的导出

heroku - Heroku 上的 Phoenix : error R10

elixir - 列表包含另一个顺序相同的列表

events - 确保在 Erlang/OTP 中切换 gen_event 处理程序时处理事件

mysql - 如何在 Erlang 中安装驱动程序? (特别是 MySQL-otp 驱动程序)

javascript - 将事件从一个事件发射器转发到另一个