elixir的gen_server实现个 定时器的例子

方式:根据erlang:send_after 启动个定时器,在gen_server 里面实现它。

直接上个测试代码:

在init初始化的时候,启动个timer,间隔时间为3秒 并输出打印 。

defmodule Distro.Cron do
  use GenServer
  require Logger

  def start_link() do
    # GenServer.start_link(__MODULE__, %{callback_function: callback_function}, name: __MODULE__)
    GenServer.start_link(__MODULE__, %{}, name: __MODULE__)
  end

  def reset_timer() do
    GenServer.call(__MODULE__, :reset_timer)
  end

  def init(state) do
    timer = Process.send_after(self(), :work, 3000)
    {:ok, %{timer: timer}}
  end

  def handle_call(:reset_timer, _from, %{timer: timer}) do
    :timer.cancel(timer)
     timer = Process.send_after(self(), :work, 3000)
    {:reply, :ok, %{timer: timer}}
  end

  def handle_info(:work, _state) do
    # Do the work you desire here

    # Start the timer again
    timer = Process.send_after(self(), :work, 3000)
    timestamp = timestamp()
   # Logger.debug "handle_info 111111"
    Logger.info("Print unixtimeStamp: #{timestamp}")
    {:noreply, %{timer: timer}}
  end

  # So that unhanded messages don't error
  def handle_info(_, state) do
    {:ok, state}
  end

  # 获取当前时间戳
  def timestamp() do
     {m,s,_} = :erlang.timestamp()
     m * 1000000 + s
  end

end

 

 

posted @ 2022-06-15 11:54  孤独信徒  阅读(47)  评论(0编辑  收藏  举报