gproc를 사용하여 famliy 이름으로 일부 프로세스를 등록하려고했습니다. 두 가지 기능을 포함하는 gen_server를 만든 이유는 첫 번째는 등록을 처리하고 두 번째는 등록 된 프로세스의 Pid를 조회하는 것입니다. 그 후, 나는이 개 얼랑 콘솔을 열고 나는 다음과 같이 내 서버 코드는 (하나 개의 프로세스를 등록하기 위해 서버 각 콘솔 요청을) 동일한 속성 두 개의 프로세스를 등록 : 나는 내 프로세스를 등록Gproc : lookup_pids를 수행 할 때 각 프로세스가 자체 pid를 반환합니다.
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [],[]).
init([]) -> gproc:start_link(), {ok, []}.
%% Synchronous call
register(Pid, Name) ->
gen_server:call(Pid, {register, Name}).
getpids(Pid, Name) ->
gen_server:call(Pid, {getpids, Name}).
handle_call({register, Name}, _From, State) ->
gproc:reg_or_locate({p,l,Name}),
{reply, Name, State};
handle_call({getpids, Name}, _From, State) ->
Pids = gproc:lookup_pids({p,l,Name}),
{reply, Pids, State}.
handle_info(Msg, State) ->
io:format("Unexpected message: pn",[Msg]),
{noreply, State}.
terminate(normal, State) ->
ok.
server_name:register(PID,<<"test">>)
난과의 PID를 조회 :
server_name:getpids(PID,<<"test">>)
을하지만 t을 시도 할 때 (기본적으로 나는 2 개의 pids로 리스트를 가져와야한다.) 나는 단지 하나의 pid를 가지고있다. (각 콘솔은 자신이 등록한 pid를 자신 으로 등록하고 다른 콘솔에 등록 된 pid를 렌더링하지 않는다).
도움 주셔서 감사합니다. 최고 감사합니다.
application:start(gproc),
다음, 나는에 (당신은 당신이 2 개 얼랑 콘솔을 여는 것을 말할 때, 당신은 2 개 얼랑 노드를 시작했다는 추측 :
나는 고유 레지스터를 가지고있는 두 개의 프로세스를 연결해야하는 이유를 나는 이해하지 못했다? –
필자의 경우 로컬 등록 작업이 필요합니다. 로컬 범위 내에서 gproc와 공유 레지스터를 갖는 또 다른 솔루션이 있습니까? –
나에게 명확하지 않은 것은 : 2 개의 쉘을 시작하거나 (두 번 erl을 실행하는 것인가) 아니면 같은 노드에'Ctrl-G','s' 그리고 나서'c2'를 사용하여 2 개의 쉘을 가지고 있습니까? – Pascal