Я изо всех сил пытался обдумать это и надеялся, что кто-то сможет указать мне правильное направление.
Я запустил mix new my_other_app --sup
и получил следующее приложение:
defmodule MyOtherApp do
def start_link do
Task.start_link(fn -> loop() end)
end
def loop do
IO.puts "running..."
:timer.sleep(1000)
loop()
end
end
И мой руководитель приложения:
defmodule MyOtherApp.Application do
use Application
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
worker(MyOtherApp, [])
]
opts = [strategy: :one_for_one, name: MyOtherApp.Supervisor]
Supervisor.start_link(children, opts)
end
end
и смешать application/0
def application do
[extra_applications: [:logger],
mod: {MyOtherApp.Application, []}]
end
Теперь мои вопросы:
- Почему, когда я запускаю
mix app.start
, приложение сразу запускается и останавливается? - Когда мне запустить
mix app.start
вместоmix run
? - Я знаю, что могу сделать
mix run --no-halt
, чтобы приложение продолжало работать вечно, но зачем? Почему, если я удалю супервизор и поставлю вызовloop/0
внизу моегоmy_other_app.ex
, он будет продолжать работать вечно сmix run
, а с супервизором - нет?
Спасибо за помощь!
mix run
используется для запуска файла (*.exs). Перед выполнением любой команды задача компилирует и запускает текущее приложение. Имейте в виду, что запуск приложения также запускает его приложения.mix app.start
запускает все зарегистрированные приложения. Я думаю, это означает, что он запускает все приложения, кроме основного приложения. - person Joe Eifert   schedule 08.03.2017