2016-02-21 2 views
2

Есть ли установленный механизм ожидания вставки в таблицу ETS, если я хочу использовать его для общего состояния?События таблицы Erlang ETS

Я знаю, что mnesia поддерживает таблицы событий, я думал, что подобный механизм будет полезен для простой ETS, чтобы процесс мог дождаться, пока не будут загружены необходимые ему данные. Я думаю, что единственный способ сделать это - вращать цикл и непрерывно запрашивать данный ключ до тех пор, пока он не появится, но это кажется очень неэффективным. Я предпочел бы получить обратный вызов. Если я вставлю процесс между моим и ETS, я просто подтолкнул проблему к линии.

ответ

2

Простейшим обходным путем было бы запустить процесс gen_server и прокси-сервер, через который он будет вставлять запросы. Затем вы можете регистрировать обратные вызовы, сохраняя их в состоянии gen_server и вызывать их, когда вставленный ключ соответствует шаблону. Он может быть даже запущен в отдельном приложении, чтобы обеспечить выделенного супервизора.

+1

Я бы хотел, чтобы с ETS был более быстрый способ, но неудачно зарегистрировать другой слой косвенности и сериализации. Я собираюсь отметить этот ответ правильно, хотя, поскольку его действительно единственный способ с ETS. – MattyB

+0

Это именно то, что делает Mnesia, а также множество других вещей, из-за чего она менее эффективна. В большинстве случаев использования ETS не требуется то, что вы хотели бы иметь - уведомления на введенный ключ. Как разработчик, я предпочитаю, чтобы ETS быстрая и (невероятно) быстро, и если мне нужна дополнительная функциональность, например уведомления или нет, ее легко добавить. Еще одна вещь заключается в том, что накладные расходы должны быть минимальными, поскольку вам нужны только запросы на вставку прокси, запросы на чтение могут по-прежнему иметь функцию в вашем модуле (для согласованности API), но могут просто вызвать соответствующие функции ETS. – Amiramix

1

ETS не имеет концепции событий.

Однако вы можете добиться того, что вы описали, поместив процесс чтения в предложение «получать», а затем запустите процесс записи, чтобы отправить сообщение читателю после загрузки данных.

+0

Это просто удаляет проблему по линии, потому что процесс записи должен знать, кто из будущих читателей будет заботиться о подписке на событие. Для моего случая использования я не представляю, что это очень показательно. Я хочу создать кучу работников, некоторым из которых, возможно, придется ждать, пока другие работники закончат обработку своих сегментов, прежде чем они смогут начать. Нет очевидного способа сопоставления этих отношений до того, как вы не выполнили сериализацию работы. – MattyB

+0

Извините, у вас не было ясно, что у вас много рабочих. В этом случае вы правы, то, что я предложил, не лучшее решение. Похоже, ваш лучший выбор - написать обертку вокруг нее. –

1

В ets нет обработки событий. Это довольно низкоуровневая функция языка и зависит от вас, чтобы создать обертку вокруг нее. Кстати, это делается в mnesia. Таким образом, вы можете обернуть ваше общее состояние в модуль, а затем подписаться и отправить себя.