2011-04-20 3 views
2

내가 gen_server가 중지 : 얼랑 gen_server

start(UserName) -> 
    case gen_server:start({global, UserName}, player, [], []) of 
    {ok, _} -> 
     io:format("Player: " ++ UserName ++ " started"); 
    {error, Error} -> 
     Error 
    end 
    ... 

지금 내가이 세대 서버를 중지하는 함수를 작성합니다. 내가 가진 :

stop(UserName) -> 
    gen_server:cast(UserName, stop). 

handle_cast(stop, State) -> 
    {stop, normal, State}; 
handle_cast(_Msg, State) -> 
    {noreply, State}. 

나는 그것을 실행

start("shk"). 
Player: shk startedok 
stop(shk). 
ok 
start("shk"). 
{already_started,<0.268.0>} 

그러나 : 작업

stop(player). 
ok 

입니다.

gen_server를 이름으로 실행하고 이름으로 중지하려면 어떻게합니까?

감사합니다.

답변

14

첫 번째 : 항상 동일한 이름을 사용하여 프로세스를 처리해야합니다 ("foo"foo). 따라서 엄격한 명명 규칙을 사용하여 시작하십시오.

둘째 : 전역 등록 프로세스를 사용할 때 주소 지정 프로세스에도 {global, Name}을 사용해야합니다.

제 생각에는 stop 함수를 gen_server:call으로 변환해야합니다.이 함수는 차단하고 gen_server에서 값을 반환하도록합니다. 예 :

stop(Name) -> 
    gen_server:call({global, Name}, stop). 

handle_call(stop, _From, State) -> 
    {stop, normal, shutdown_ok, State} 

이렇게하면 shutdown_ok이 호출자에게 반환됩니다.

이렇게 말하면 global 모듈은 다소 제한적이며 gproc과 같은 대안은 훨씬 더 나은 배포를 제공합니다.

+0

gen_server에는이 중지/1을 수행하는 특수 기능이 있습니다. 중지/3 http://erlang.org/doc/man/gen_server.html#stop-1 –

1

나는 내 문서를 가지고 있지 않지만 제 생각에 gen_server 캐스트 내의 전역 튜플에 사용자 이름을 래핑해야 할 것입니다.