현재 저는 엘릭서의 유비쿼터스 프로세스 링을 통해 작업하고 있습니다. 링이 연결되어 있지만, 다음과 같은 방식으로 :프로세스 링의 링크 비대칭
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