Pergunta

Eu terminei recentemente o livro de Joe e gostei bastante. Eu estou desde então comecei a codificação uma aplicação em tempo real macio com erlang e eu tenho que dizer que estou um pouco confuso com o uso de gen_server.

Quando devo usar gen_server em vez de um módulo simples apátrida? I definir um módulo sem estado como segue: - módulo A que leva-lo do estado como um parâmetro (muito parecido com ETS / DETS) em oposição a mantê-lo internamente (como gen_server)

Say para um módulo gerente tipo de fatura, ele deve inicializar e estado de retorno que eu, então, passar posteriormente a ele? SomeState = InvoiceManager: Init (), SomeState = InvoiceManager:. AddInvoice (SomeState, AnInvoiceFoo)

Suponha que eu precisaria de várias instâncias do estado gerente de factura (dizem que meu aplicativo gerencia várias empresas, cada uma com suas próprias faturas), deve cada um deles tem um gen_server com estado interno para gerir as suas facturas ou seria melhor ajuste simplesmente ter o módulo sem estado acima?

Onde está a linha entre os dois?

(Nota da factura gerenciar exemplo acima é apenas isso, um exemplo para ilustrar a minha pergunta)

Foi útil?

Solução

Ele depende fortemente de suas necessidades e design do aplicativo. Quando você precisar de estado compartilhado entre os processos que você tem que usar o processo para manter este estado. Então gen_server, gen_fsm ou outro gen_* é seu amigo. Você pode evitar este projeto quando seu aplicativo não é concorrente ou este projeto não traz-lhe alguns outros benefícios. Por exemplo quebrar a sua aplicação aos processos levará a concepção mais simples. Em outro caso, às vezes você pode escolher projeto de processo único e usando módulos "apátridas" para desempenho ou tal. módulo "apátrida" é a melhor escolha para tarefas muito simplesmente apátridas (puros funcionais). gen_server é muitas vezes melhor escolha para pensa que parece naturalmente "processo". Você deve usá-lo quando você quer algo share entre processos (usando processos podem ser limitados pela escalabilidade ou a simultaneidade).

Outras dicas

Eu realmente não acho que você pode fazer essa distinção entre o que você chama um módulo de apátridas e gen_server. Em ambos os casos, há uma recursiva receber circuito que carrega Estado em pelo menos um argumento. Este loop principal lida com solicitações, funciona de acordo com as solicitações e, quando necessário, envia resultados de volta os solicitantes. O loop principal provavelmente irá lidar com uma série de pedidos administrativos, bem como que não pode ser parte do principal API / protocolo.

A diferença é que gen_server abstrai o principal receber loop e permite que o usuário apenas para a gravação do real código do usuário . Ele também irá lidar com muitas funções de OTP administrativa para você. A principal diferença é que o código do usuário está em outro módulo que significa que você veja o atravessou estado mais facilmente. A menos que você realmente conseguem escrever seu código em um grande receber loop e não chamar outras funções para fazer o trabalho, não há diferença real.

Qual método é melhor depende muito do que você precisa. Usando gen_server irá simplificar o seu código e dar-lhe adicionado funcionalidade "de graça", mas pode ser mais restritiva. Rolling seu próprio lhe dará mais poder, mas também de dar mais possibilidades de screww as coisas. É provavelmente um pouco mais rápido também. O que você precisa?

Tendo usado ambos os modelos, devo dizer que usando o gen_server fornecido me ajuda a ficar estruturado mais facilmente. Eu acho que é por isso que está incluído na pilha OTP de ferramentas:. Gen_server é uma boa maneira de obter a caldeira-plate repetitivo fora do caminho

Se você compartilhou estatal sobre vários processos você provavelmente deve ir com gen_server e se o estado é apenas local para um processo de um módulo sem estado vai fazer bem.

Suponho suas faturas (ou o que eles representam) deve ser persistente, então eles iria acabar em uma tabela ETS / Mnesia de qualquer maneira. Se isto é assim, você deve criar um módulo sem estado onde você colocar o seu API para acessar a tabela da fatura.

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