我有一个简单的GenServer
内容,我希望创建一个每两秒调用一次函数的循环:
defmodule MyModule do use GenServer def start_link(time) do GenServer.start_link(__MODULE__,time) end #Start loop def init(time) do {:ok, myLoop(time)} end #Loop every two seconds def myLoop(time) do foo = bah(:someOtherProcess, {time}) IO.puts("The function value was: #{foo}") :timer.sleep(2000) myLoop(time + 2) end end
但是当我打电话给:
{:ok, myServer} =MyModule.start_link(time) IO.puts("Now I can carry on...")
我从来没有看到上述电话的回复.我觉得这很明显.所以我的问题是,如何在不阻止下游执行任务的过程的情况下创建我想要的循环?
谢谢.
完成你想要做的最好/最干净的方法是Process.send_after/3
.它将超时委托给调度程序,而不是另一个进程.
defmodule MyModule do use GenServer def start_link(time) do GenServer.start_link(__MODULE__,time) end def init(time) do schedule_do_something(time) {:ok, %{time: time}} end def handle_info(:do_something, state) do %{time: time} = state # do something interesting here schedule_do_something(time) {:noreply, state} end defp schedule_do_something(time_in_seconds) do Process.send_after(self, :do_something, (time_in_seconds * 1000)) end end
无论如何,GenServer就像一个事件循环,为什么要自己重新实现呢?