当前位置:  开发笔记 > 编程语言 > 正文

Elixir阻止了GenServer进程

如何解决《Elixir阻止了GenServer进程》经验,为你挑选了1个好方法。

我有一个简单的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...")

我从来没有看到上述电话的回复.我觉得这很明显.所以我的问题是,如何在不阻止下游执行任务的过程的情况下创建我想要的循环?

谢谢.



1> Jason Harrel..:

完成你想要做的最好/最干净的方法是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就像一个事件循环,为什么要自己重新实现呢?

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有