Уникальный атом для gen_fsm: start / 3 в Erlang - PullRequest
2 голосов
/ 02 мая 2011

Я сейчас нахожусь в проекте создания игрового сервера.Предполагается, что у каждого игрока есть собственный процесс с поведением gen_fsm.Для запуска gen_fsm с start / 3 нам нужен уникальный атом, в настоящее время мы используем make_ref () и нашли способ превратить этот ref в атом с помощью ref_to_list / 1.Но согласно этому посту это не рекомендуется и я с ним согласен.

Как бы вы решили эту проблему?Когда мы запускаем gen_fsm с локальной опцией, нам нужен атом, чтобы идентифицировать его.

Ответы [ 3 ]

7 голосов
/ 02 мая 2011

Если вы используете gen_fsm:start/3, то единственный атом, который вам нужен, - это имя модуля обратного вызова.Таким образом, вам нужно только отслеживать PID (идентификатор процесса), который автоматически будет уникальным.

Если вам необходимо выполнить процесс gen_fsm позже, либо сохраните PID в какой-либо таблице сопоставления, либоНазовите процесс (как вы сделали).

2 голосов
/ 02 мая 2011

Может быть, я что-то упускаю, но похоже, что лучше всего вам не указывать опцию local, т.е. не давать процессу gen_fsm имя.

Стоит отметить, что ограничено числом уникальных атомов , которое может использовать экземпляр erlang vm.Так что генерация множества случайных атомов, вероятно, плохая идея.

0 голосов
/ 02 мая 2011

Вы должны увидеть gproc (https://github.com/esl/gproc), чтобы создать реестр процессов для связи какого-либо термина erlang с pid () процесса. Не рекомендуется регистрировать каждый запущенный процесс gen_fsm с уникальным атомом.

...