3

Mix 構成ファイルがないことを無視して、次のように記述します。

defmodule Test.Supervisor do
    use Supervisor

    def start_link do
      #"name:" will show up in :observer...
        Supervisor.start_link(__MODULE__, [], [name: :"root_supervisor"])
    end

    def init(args) do
        children = [
            worker(Test.Method, [], [function: :start, id: "my_root_process"]),
        ]

        supervise(children, [strategy: :one_for_one, name: :root])
    end
end

defmodule Test do
    def start(_type, _args) do
        Test.Supervisor.start_link()
    end
end

defmodule Test.Method do
    def start do
        IO.puts("Expect to see me often... #{self}")
    end
end

アプリケーションを再起動せずに最初の実行 (iex -S mix) の後にクラッシュします。エラーメッセージは次のとおりです。

=INFO REPORT==== 14-Jan-2016::22:34:04 ===
    application: logger
    exited: stopped
    type: temporary
** (Mix) Could not start application mememe: Test.start(:normal, {}) returned
an error: shutdown: failed to start child: "my_root_process"
    ** (EXIT) :ok

ただし、次のように直接Test.start()呼び出すように変更した場合:Test.Method.start()

defmodule Test do
    def start(_type, _args) do
        Test.Method.start()
    end
end

その後、正常に実行されますが、コードは監視されません。ここでの実装または理解のいずれかで基本的な間違いを犯していると確信していますが、その間違いは正確には何ですか?

4

2 に答える 2

2

コードにはいくつかの問題があります。まず、監視するために長時間実行される関数が必要です。何かのようなもの:

def loop do
  receive do
    _anything -> IO.puts "Expect to see me often"
  end
  loop
end

次に、Test.Methodモジュールで、それを生成する必要があります。

def start do
  IO.puts("Starting...")
  pid = spawn_link(&loop/0)
  {:ok, pid}
end

start 関数が tuple を返すことが重要です{:ok, pid_to_supervise}。スーパーバイザーがプロセスを監視することを期待していたため、アプリがクラッシュしていましたが、:okによって返されたアトムしか取得しませんでしたIO.puts。ワーカー仕様は新しいプロセスを生成しません。生成されたプロセスの pid を返す関数が必要です。

また、スーパーバイザーを監視対象プロセスにリンクする必要があるため、最終的には、@Jason Harrelson が提案したstart_linkのではなく、関数の名前を に変更することをお勧めします。start

プロジェクトを適切に開始するには、これで十分です。オブザーバー セクションにプロセスが表示されないことに注意してくださいApplications。あなたはApplication行動を使用していないので、あなたのroot_supervisor意志はどこかに浮かんでいます。タブで見つけることができProcessesます。スーパーバイザーで使用するIDなので、タブmy_root_processでも見えません。Processes

この方法でのスポーン プロセスは、教育目的では簡単ですが、実際のシステムでは、プロセスが OTP 設計原則に従う必要があります。これは、システム メッセージへの対応、ロギング、トレース、およびデバッグの改善を意味します。すべての要件を満たすプロセスを作成するのは非常に困難ですが、手動で行う必要はありません。すべての動作は、これらの原則を実装しています。

したがって、ループでプロセスを生成する代わりに、を使用してみてくださいGenServer

于 2016-01-15T08:27:37.940 に答える