2017-01-29 24 views
0

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 개 얼랑 노드를 시작했다는 추측 :

답변

0

은 내가 gproc 응용 프로그램을 시작하는 올바른 방법은 사용하는 것입니다 생각 2 콘솔에서 리눅스를 실행하는 erl). 여기서 host_name @ 노드 1 :

1

다음
erl -sname node1 

노드 이름을 표시하는 얼랑 쉘 프롬프트가 콘솔에서 :이 경우, 예를 들어, 클러스터의 두 노드를 연결하여 사용할 필요가 콘솔

2

erl -sname node2 

다음 당신은 어떤을 보여주는 얼랑 쉘 프롬프트를 얻을 드 이름 : HOST_NAME의 @의 노드 2 노드 2에서 여전히

:

true = net_kernel:connect_node('[email protected]'). 
application:start(gproc). 

응용 프로그램 gproc이 시작 이제 2 개 얼랑 노드가 연결되어, 당신은 프로세스를 등록 할 수 있습니다.

같은 키로 여러 프로세스를 등록하려면 gproc:reg_or_locate/1 함수를 사용하는 것이 맞는지 확실하지 않습니다. gproc:reg/1을 사용했을 것입니다. 등록 컨텍스트에 대한

같은 일이, 나는 세계 사용한 것 : gproc:reg({p,g,Name})

+0

나는 고유 레지스터를 가지고있는 두 개의 프로세스를 연결해야하는 이유를 나는 이해하지 못했다? –

+0

필자의 경우 로컬 등록 작업이 필요합니다. 로컬 범위 내에서 gproc와 공유 레지스터를 갖는 또 다른 솔루션이 있습니까? –

+0

나에게 명확하지 않은 것은 : 2 개의 쉘을 시작하거나 (두 번 erl을 실행하는 것인가) 아니면 같은 노드에'Ctrl-G','s' 그리고 나서'c2'를 사용하여 2 개의 쉘을 가지고 있습니까? – Pascal