multithreading - 在计时器上运行任务

标签 multithreading timer elixir erlang-otp

我想创建一个按时间间隔运行函数的程序。我对 Elixir 还是很陌生,不知道从哪里开始。我的想法是,既然我们可以使用 GenServer 创建一个程序来循环等待消息,我可以向它提供消息(可能是 :kick)以及何时它收到此消息,它将运行该函数。

但是,这留下了一个问题 - 我如何在没有 cron 作业的情况下启动它?我可以启动一个线程并运行一个计时器,它会在一定时间间隔内启动它吗?如果主线程死了 - 是否有一种简单的方法可以通知并重新启动它?

谢谢!

最佳答案

您可以使用 timer:send_interval/2与 GenServer。您需要从 init/1 回调中调用该函数,然后从 handle_info 回调中处理滴答消息。这是一个每秒打印 0、1、2、... 的示例:

defmodule A do
  use GenServer

  def init(_) do
    :timer.send_interval(1000, :tick)
    {:ok, 0}
  end

  def handle_info(:tick, state) do
    IO.inspect state
    {:noreply, state + 1}
  end
end
iex(1)> GenServer.start_link(A, [])
{:ok, #PID<0.94.0>}
0
1
2
3
4
...

If the main thread dies - is there an easy way to be notified and restart it?

您应该查看 Supervisors .上面的 GenServer 可以作为“worker”添加到 Supervisor。如果 GenServer 因任何原因退出,Supervisor 可以处理重启。

关于multithreading - 在计时器上运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46869458/

相关文章:

c++ - 一秒计时器

elixir - 在 Controller 中呈现静态 html 页面

ios - 只有屏障任务的并发队列

java - 使用不同端口与 intern() 运行 2 个 Tomcat 服务器是否会锁定相同的 id?

python - 在python中创建一个带有暂停函数的计时器

c# - 为什么 System.Threading.Timer 会自行停止?

c++ - 从 CreateTool32Help api 隐藏线程

c# - C#Windows窗体自定义控件跨线程操作

docker - 在Docker容器中运行简单的Elixir应用程序时出错

elixir - 如何在 Elixir 中检查结构体字段的类型?