我試圖產生一個進程,每五秒發送一個HTTP請求來向服務器報告心跳。我的代碼是:產生一個有監督的進程來定期報告心跳
defmodule MyModule.Heartbeat do
def start_link do
spawn_link(fn ->
:timer.apply_interval(:timer.seconds(5), __MODULE__, :beat, [])
end)
end
defp beat do
HTTPoison.post "https://myserver/heartbeat
end
end
defmodule MyModule.Supervisor do
use Supervisor
def start_link do
Supervisor.start_link(__MODULE__, :ok)
end
def init(:ok) do
children = [
worker(MyModule.Heartbeat, [])
]
supervise(children, strategy: :one_for_one)
end
end
然而,當我嘗試啓動應用程序,它具有以下錯誤退出:
[info] Application my_module exited: MyModule.start(:normal, []) returned an error: shutdown: failed to start child: MyModule.Heartbeat
** (EXIT) #PID<0.535.0>
所有我需要的是一些過程,將運行的一部分監督樹並在指定的時間間隔內發送請求。它不需要能夠自己接收任何消息,我也不太爲特定的實現感到困擾。
任何人都可以提出我在這裏做錯了什麼,這阻止了這個過程開始,如果有可能有更好的方式來實現這一目標?
爲什麼心跳繼續使用後,開始工作:無限的睡眠?整個事情不應該凍結和停止? –
':timer.sleep(:infinity)'「凍結」只執行該代碼的進程(Erlang進程)。 ':timer'應用程序仍在運行,並以指定的時間間隔調用我們要求的函數。 – Dogbert
太棒了,謝謝:) –