Процессы убийства в Эрланге с помощью PID - PullRequest
2 голосов
/ 18 ноября 2010

Я использую чат-сервер на Erlang . Согласно моей схеме, у каждого клиента есть соответствующий агентский процесс на узле сервера, который обрабатывает сообщения. Я записываю PID агентов в базу данных, чтобы я мог обмениваться сообщениями между ними.

Безопасно ли, когда я убиваю PID? Например, после перезапуска моего сервера PID все еще находятся в базе данных (но процессы умрут), будут ли шансы, что PID в базе данных вступят в конфликт с некоторыми другими (недавно созданными) важными процессами?

Если это так, я не могу просто убить агента, когда клиент не отвечает. Пока я этого не наблюдал, но было бы неплохо знать наверняка.

Ответы [ 2 ]

7 голосов
/ 18 ноября 2010

PID присваиваются в порядке появления от 0.0.0 (init) каждый раз, когда запускается узел.Так что да, вы можете легко получить коллизии PID, если сохраните их между перезапусками узла.

Вы создали какой-то реестр, чтобы позволить вам искать PID для конкретного клиента - этот реестр должен удалять мертвыеСвоевременно.Типичный дизайн для реестра для мониторинга (erlang:monitor/2) каждого зарегистрированного процесса и удаления записи реестра, когда процесс умирает и получено сообщение {'DOWN', Ref, process, Pid, Info}.

Я бы также добавил, что хранение PID внеerlang (если ваша база данных не ets или mnesia) необычен по этой причине - PID ничего не будет значить после смерти процесса или узла.

0 голосов
/ 18 ноября 2010

PID могут быть повторно использованы при перезапуске.Весьма вероятно, что они столкнутся с другими PID, потому что они последовательные.Обязательно удалите из вашей базы данных любой PID, соответствующий вышедшему из строя узлу.

1> spawn(fun () -> ok end).
<0.35.0>
2> spawn(fun () -> ok end).
<0.37.0>
3> spawn(fun () -> ok end).
<0.39.0>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...