我想创建一个程序在一段时间内运行一个函数。我对Elixir仍然很陌生,不知道从哪里开始。我的想法是,既然我们可以用GenServer
来创建一个程序来坐等在消息循环,我可以提供它的消息(也许:kick
),当它接收到这个消息时,它会运行的功能。在定时器上运行一个任务
然而,留下一个问题 - 我怎么踢它不cron作业?我可以启动一个线程并运行一个定时器,并在一段时间内启动它吗?如果主线程死了 - 是否有一个简单的方法来通知并重新启动它?
谢谢!
我想创建一个程序在一段时间内运行一个函数。我对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
...
如果主线程死亡 - 是否有通知,并重新启动它的一个简单的方法?
你应该看看Supervisors。上面的GenServer可以作为“工作人员”添加到Supervisor。如果出于任何原因退出,Supervisor可以处理重新启动GenServer。
@Dogbert提到使用Erlang的send_interval
函数,它的使用方式如下::timer.send_interval(milliseconds, process, message)
。
一个快速谷歌搜索然而,使我获得the quantum-elixir
library这似乎是能够像调度的cron,以及在运行时的调度任务。
http://erlang.org/doc/man/timer.html#send_interval-3 – Dogbert
@Dogbert哇大。我如何在elixir中引用erlang函数?你能否提供一个小例子作为答案,以便我可以接受并给你分数? – rec