Уникальный атом для gen_fsm:start/3 в Erlang
В настоящее время я работаю над проектом по созданию игрового сервера. Предполагается, что у каждого игрока есть собственный процесс с поведением gen_fsm. Для запуска gen_fsm с start/3 нам нужен уникальный атом, в настоящее время мы используем make_ref() и нашли способ превратить этот ref в атом с помощью ref_to_list/1. Но согласно этому посту это не рекомендуется и я с ним согласен.
Как бы вы решили эту проблему? Когда мы запускаем gen_fsm с локальной опцией, нам нужен атом, чтобы идентифицировать его.
3 ответа
Если вы используете gen_fsm:start/3
единственный атом, который вам нужен, это имя модуля обратного вызова. Таким образом, вам нужно только отслеживать PID (идентификатор процесса), который автоматически будет уникальным.
Если вам нужно добраться до gen_fsm
позже, либо сохраните PID в какой-либо таблице сопоставления, либо назовите процесс (как вы это сделали).
Может быть, я что-то упускаю, но, похоже, ваш лучший образ действий - не указывать local
вариант, т.е. не давать процессу gen_fsm имя.
Стоит отметить, что существует ограничение на количество уникальных атомов, которые может использовать экземпляр erlang vm. Поэтому генерация большого количества случайных атомов, вероятно, плохая идея.
Вы должны увидеть gproc (https://github.com/esl/gproc), чтобы создать реестр процессов, чтобы связать некоторый термин erlang с pid() процесса. Не стоит регистрировать каждый запущенный процесс gen_fsm с уникальным атомом.