Sono davvero alle prese con i supervisori Elixir e ho capito come chiamarli per poterli usare. Fondamentalmente, sto solo provando ad avviare un supervisore Task
a cui posso inviare messaggi.Supervisori elisir - Come si chiama un'attività supervisionata
così ho il seguente:
defmodule Run.Command do
def start_link do
Task.start_link(fn ->
receive do
{:run, cmd} -> System.cmd(cmd, [])
end
end)
end
end
con il punto di ingresso del progetto come:
defmodule Run do
use Application
# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
import Supervisor.Spec, warn: false
children = [
# Define workers and child supervisors to be supervised
worker(Run.Command, [])
]
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: Run.Command]
Supervisor.start_link(children, opts)
end
end
A questo punto, non so nemmeno sicuri che sto usando la cosa giusta (Task
in particolare). Fondamentalmente, tutto ciò che voglio è generare un processo o un'attività o GenServer o qualsiasi altra cosa è giusta quando l'applicazione si avvia che posso inviare messaggi a cui faremo essenzialmente un System.cmd(cmd, opts)
. Voglio che questo compito o processo sia supervisionato. Quando invio un messaggio {:run, cmd, opts}
come {:run, "mv", ["/file/to/move", "/move/to/here"]}
, voglio che crei una nuova attività o processo per eseguire quel comando. Per il mio utilizzo, non ho nemmeno bisogno di riprendere la risposta dal compito, ho solo bisogno di eseguire. Qualsiasi guida su dove andare sarebbe utile. Ho letto la guida introduttiva, ma onestamente mi ha lasciato più confuso perché quando provo a fare ciò che è fatto non risulta mai come nell'applicazione.
Grazie per la vostra pazienza.
Questa è una soluzione perfetta. Il motivo per cui non è possibile assegnare un nome a un'attività è perché se si desidera inviarlo messaggi ... non si desidera più utilizzare un'attività. –
Grazie per la spiegazione di questo dettaglio. Questo è stato molto utile per me @ bitwalker. Grazie per il vostro tempo, assistenza e pazienza. – kkirsche
@bitwalker Quando si tenta di utilizzare questo ottengo un timeout GenServer.call. Non dovrebbe il supervisore impedire che questo tipo di cose accada? (uscita) chiuso in: GenServer.call (Run.Command, {: run, "ls", ["."]}, 5000) ** timeout (EXIT) (elixir) lib/gen_server.ex: 356 GenServer.call/3 – kkirsche