如何使用elixir创建一个事件发射器,otp方式

mat*_*ter 10 elixir erlang-otp eventemitter

在elixir中创建前景过程的最佳方法是什么,该过程在每个给定的时间内打勾?

我的主要问题是这样的方法:

defmoulde Ticker do
  def tick do
    do_something()
    :timer.sleep(1000)
    tick
  end
end
Run Code Online (Sandbox Code Playgroud)

工作,但设计错了.它肯定不会每秒都在滴答作响,但是每秒都会增加do_something()的时间.我可以产生一个处理"某事"的过程,但仍有一个小的滞后.

此外,我正在尝试构建一个混合应用程序,有一些GenServers参与,以及一个主要的前台进程(我在这里问的那个)应该每隔x秒调用一次服务器.有这样的otp方式吗?

Paw*_*rok 16

我认为timer:apply_interval/4应该适合您的需求.使用这样的东西:

defmodule Tick do
  def tick do
    IO.inspect(:tick)
  end
end

:timer.apply_interval(:timer.seconds(1), Tick, :tick, [])
Run Code Online (Sandbox Code Playgroud)

顺序中的参数是interval,模块名称,要调用的函数以及调用它的参数.然后你可以向你的GenServers内部发送消息.查看完整的文档:apply_interval/4

另一件需要考虑的事情是,如果你的tick函数只是向某些人发送简单的消息,GenServers那么它可能非常快,所以你的实现可能没问题,一旦被包装Task并插入监督树(如果你不关心潜在的轻微漂移是).