Я создал процесс объединения соединений в Erlang, который имеет подпроцессы (каждый из которых является соединением). Процесс объединения соединений (супервизор) должен хранить состояние всех дочерних подпроцессов, например флаг, указывающий, доступен ли подпроцесс для сдачи в аренду запрашивающей стороне. Это состояние хранится в таблице ETS.
ПУЛ-МАСТЕР:
- процесс подключения 1
- процесс подключения 2
- процесс подключения 3
Когда клиент запрашивает подключение к POOL-MASTER, он должен выяснить, какой процесс подключения доступен, просматривая ETS и получая состояние. Этот этап называется "получить аренду". Затем состояние обновляется. Точно так же, когда клиент возвращает соединение с пулом, он использует функцию "return-lease", которая помечает элемент как доступный для следующего клиента.
Я хочу, чтобы функции выше "get-lease и return-lease" были поточно-ориентированными. Другими словами, я хочу убедиться, что ни один клиент не использует эти функции одновременно, иначе получается, что состояние соединений может быть перепутано (два клиента получают одно и то же соединение). В java для этой цели будет использоваться синхронизированный метод.
Есть ли что-нибудь в erlang, что можно сделать для этого? Например, какой-то механизм блокировки в таблице ETS, а затем снятие блокировки? Или это следует сделать, создав единый процесс, который обрабатывает определенные функции, которые должны быть заблокированы/разблокированы, и отправляет сообщения этому процессу (при условии, что обмен сообщениями является однопоточным)?