Как перебрать множество GenServer одного типа? - PullRequest
0 голосов
/ 02 февраля 2019

Проблема: у меня тип FlyServer, и мне нужно пройти через все процессы Fly.Для различных вычислений на сервере.

Как мне это сделать?

Один из вариантов - иметь список GenServer всех процессов FlyServer.Но что, если он сломается?И что, если игрок падает, и по какой-то причине GenServer, отслеживающий процессы, не уведомляется - сообщите, если этот сценарий нереалистичен, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я советую вам запускать ваши серверы, используя супервизор с вызовом супервизора: start_child / 2.Супервизору следует использовать стратегию simple_one_for_one, которая предназначена для создания и контроля процессов одного и того же типа.

Затем вы можете получить обновленный список всех детей, используя функцию supervisor: which_children / 1

0 голосов
/ 03 февраля 2019
  1. Каждый раз, когда процесс Fly связывается с сервером, вы можете добавить его pid в список, где список является частью состояния gen_server.

  2. Затем сервер может monitor процесс Fly, что означает, что после завершения процесса Fly сервер получит специальное сообщение.

  3. Сервер может реализовать условие получения, которое шаблон соответствует специальному сообщению, а затем удаляет pid завершенного процесса из списка.

Один из вариантов - иметь список GenServerвсех процессов FlyServer.Но что, если произойдет сбой?

Тогда в модуле обратного вызова будет вызван terminate(Reason, State), который может сохранить состояние в таблице ets, dets или mnesia.Конечно, если кто-то споткнется о шнур, соединяющий сервер, на котором работает FlyServer, с электрической розеткой, выполнение будет немедленно остановлено и terminate() не будет вызвано.См. distributed erlang для решений.

...