Pergunta

Os tutoriais são abundantes para trabalhar com GEN_Servers que são nomeados em um aplicativo OTP. No entanto, não consegui encontrar um bom exemplo de servidores dinamicamente que não sejam registrados (não nomeados). Alguém pode apontar para um exemplo simples e simples? Não é Ejabberd, por exemplo, onde há muito o que confundir a ideia principal que estou tentando conseguir.

Obrigado.

Foi útil?

Solução

Eu tenho alguma desova dinâmica de trabalhadores em uma árvore de supervisão em andamento http://github.com/noss/iserve. O aplicativo ISERVE tem um processo mestre registrado que eu chamo iserve_master É supervisionado junto com um supervisor de modo simples para um.

o iserve_master é para pedir ao Iserve para iniciar um servidor HTTP. Pode ter múltiplos iservers, desde que se ligam a endereços exclusivos. Os servidores iniciados constroem um nome para eles mesmos, mas isso é para simplificar a depuração, ele gera um átomo usando o nome da porta.

Um servidor é um loop "eterno" esperando por um iserve_socket ligar de volta sobre ter aceitado uma conexão. Começa o primeiro no init.

O soquete iniciado não está sob supervisão porque não é capaz de reiniciar sem perder a conexão de soquete HTTP de qualquer maneira. E eu vejo isso como um recurso para não se importar. Fogo e esqueça.

Está longe de ser perfeito, mas uma arquitetura que eu gosto.

Outras dicas

O exemplo mais simples seria:
Deixe de fora o primeiro argumento {local, nome} em Gen_Server: Iniciar: ou seja, assumindo que seu módulo é chamado mod:

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

Então você faz:

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

e o Gen_Server está em funcionamento.
Cada chamada para esta função gera um novo processo Gen_Server sem nome. Observe que este exemplo está usando começar (e não start_link) para uso independente (fora de um contexto de supervisor).

o plug-in RabbitMQ-fovel Parece ter um exemplo disso - consulte Rabbit_shovel_sup.erl e rabbit_shovel_worker.erl. Ele gera processos de trabalhadores gen_server com base em configurações em um arquivo de configuração.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top