В настоящее время я изучаю Эрланг на приемлемом клипе, но у меня есть вопрос о gen_server с супервизорами. Если процесс gen_server завершается сбоем и последовательно перезапускается супервизором, он получает новый pid. А что если я хочу, чтобы другие процессы ссылались на этот процесс через Pid? Какие хорошие идиоматические способы «обновить» Pid в этих процессах?
В качестве упражнения с некоторым практическим приложением я пишу сервер блокировки, где клиент может запросить блокировку с помощью произвольного ключа. В идеале я хотел бы, чтобы отдельные процессы обрабатывали блокировку и освобождение определенной блокировки, идея в том, что я могу использовать аргумент timeout в gen_server, чтобы завершить процесс, если никто не запросил его после N количества времени, так что только в настоящее время соответствующие замки останутся в памяти. Теперь у меня есть процесс каталога, который отображает имя блокировки на процесс блокировки. Когда процесс блокировки завершается, он удаляет блокировку из каталога.
Меня интересует, как справиться со случаем, когда клиент запрашивает блокировку, когда процесс блокировки находится в середине завершения. Он еще не отключился, так что нюхать, что пид жив, не сработает. Процесс блокировки еще не достиг условия, которое удаляет его из каталога.
Есть ли лучший способ справиться с этим?
EDIT
В настоящее время существует два gen_servers: «каталог», который поддерживает таблицу ETS из LockName -> Lock Process, и «серверы блокировки», которые динамически добавляются в дерево контроля с помощью start_child. В идеале я хотел бы, чтобы каждый сервер блокировки обрабатывал разговоры с клиентами напрямую, но меня беспокоит сценарий запроса на получение / освобождение, который выдается с вызовом или приведением, когда процесс находится в середине сбоя (и поэтому не отвечает к сообщению).
Начиная с {local} или {global} не будет работать, поскольку их может быть N.