私は現在、エリクシルのユビキタスプロセスリングを使っています。 リングがリンクされているが、以下の方法で:プロセスリングの非対称性のリンク
iex(1)> Ring.Worker.create_ring_of_linked_processes(3)
Ring.Worker.create_ring_of_linked_processes(3)
[%{"links" => [#PID<0.121.0>, #PID<0.120.0>], "pid" => #PID<0.122.0>},
%{"links" => [#PID<0.120.0>, #PID<0.122.0>], "pid" => #PID<0.121.0>},
%{"links" => [#PID<0.121.0>], "pid" => #PID<0.120.0>}]
私はここのリンクの非対称性を気づいた - #PID<0.120.0>
マッピング"links" => [#PID<0.121.0>,#PID<0.122.0>]
だけでなく"links" => [#PID<0.121.0>]
を持っている必要がありますか?あなたはその:links
を集めると同時にプロセスをリンクしているので、これがある
def loop() do
receive do
{:link, pid} when is_pid(pid) ->
Process.link(pid)
loop()
end
end
def create_ring_of_linked_processes(num_of_processes) do
num_of_processes
|> create_processes
|> link_processes([])
end
def link_processes([pid1, pid2 | rest], linked_processes) do
send(pid1, {:link, pid2})
:timer.sleep(1)
{:links, links} = Process.info(pid1, :links)
link_processes(
[pid2 | rest], [%{"pid" => pid1, "links" => links} | linked_processes]
)
end
def link_processes([pid | []], linked_processes) do
%{"pid" => first_pid, "links" => _} = List.last(linked_processes)
send(pid, {:link, first_pid})
:timer.sleep(1)
{:links, links} = Process.info(pid, :links)
[%{"pid" => pid, "links" => links} | linked_processes]
end
@spec create_processes(integer) :: [pid]
def create_processes(num_of_processes) do
for _ <- 1..num_of_processes, do: spawn(__MODULE__, :loop, [])
end
[MCVE](https://stackoverflow.com/help/mcve)を投稿できますか?あなたが 'Process.info(pid、:links)'からのリンクを取得しているなら、あなたはそれをあまりにも早く呼び出すかもしれません。プロセスが 'Process.link/1'を使用してリンクされている場合、リンクは対称でなければなりません。 – Dogbert
@Dogbert確かに更新されました。私は1ミリ秒の遅延を使用しています。 – category
すべての 'Process.link/1'呼び出しが行われた後、' Process.info(_、:links) 'を収集するためにこれを変更する必要があると思います。 – Dogbert