2010-02-12 3 views
4

자습서는 OTP 응용 프로그램에서 명명 된 gen_servers에 대한 작업이 많습니다. 그러나 등록되지 않은 (명명되지 않은) 서버를 동적으로 생성하는 좋은 예를 찾을 수 없었습니다. 누군가 좋은, 간단한 예를 가리킬 수 있습니까? ejabberd가 아니라, 내가 얻으려고하는 핵심 아이디어를 혼란스럽게하는 곳이있다.등록되지 않은 동적으로 생성 된 gen_server의 사용 예는 무엇입니까?

감사합니다.

답변

1

http://github.com/noss/iserve에있는 감독 트리에서 작업자의 동적 스폰가 발생했습니다. iserve 응용 프로그램에는 iserve_master이라고하는 마스터 등록 프로세스가 있으며이 프로세스는 하나의 모드 감독자를위한 간단한 프로세스와 함께 관리됩니다.

iserve_master은 iserve에게 http 서버를 시작하도록 요청하는 것입니다. 고유 한 주소에 바인드하는 한 여러 iserver를 가질 수 있습니다. 시작된 서버는 자신의 이름을 구성하지만 디버깅을 단순화하기 위해 포트 이름을 사용하여 원자를 생성합니다.

서버는 iserve_socket이 연결 수락에 관해 콜백하기를 기다리는 "영원한"루프입니다. 그것은 init에서 첫번째 것을 시작합니다.

어쨌든 http 소켓 연결을 끊지 않고 다시 시작할 수 없기 때문에 시작된 소켓은 감독하에 있지 않습니다. 그리고 나는 그것을 신경 쓰지 않는 약간의 특징으로 본다. 화재와 잊기.

완벽하지는 않지만 내가 좋아하는 아키텍처입니다.

0

rabbitmq-shovel plugin에는 이에 대한 예가 나와 있습니다 (rabbit_shovel_sup.erl 및 rabbit_shovel_worker.erl 참조). 구성 파일의 설정에 따라 worker gen_server 프로세스가 생성됩니다.

2

가장 간단한 예는 다음과 같습니다 시작 :
gen_server의 첫 번째 인수 {지역 이름}를 생략 를, 즉 모듈을 가정하는 것은 모드라고 :

start(ArgX) -> 
    gen_server:start(mod, [ArgX], []). 

당신이 할 :

> {ok, Pid} = gen_server:start(mod, [66], []). 

이며 gen_server가 실행 중입니다.
이 함수를 호출 할 때마다 이름이 지정되지 않은 새 gen_server 프로세스가 생성됩니다. 이 예제에서는 독립 실행 형 (감독자 컨텍스트 외부) 용으로 시작 (start_link 아님)을 사용하고 있습니다.

관련 문제