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/

相关文章:

javascript - 将 vanilla JS 对象作为 prop 传递给子组件

hmac - 如何在 Elixir 中生成 HMAC 字符串?

javascript - 你如何在 node.js 中共享 EventEmitter?

elixir - 使用带有 iex -S mix phoenix.server 的 webpack 时如何摆脱 ^H?

elixir - 如何在苦艾酒中使用时间戳? ( Phoenix 1.3)

architecture - SOA:为什么不使用 Erlang/OTP Web 服务器作为服务?

erlang - Erlang 代码热交换在事件过程中是如何工作的?

javascript - NodeJS 中的事件,在 setInterval 内发出事件,但在没有 setInterval 时则不会发出事件

elixir - 从元组列表中选择值 Elixir

elixir - Elixir 中 Ruby 的 Array.pack 的等价物