2016-02-21 2 views
2

Existe-t-il un mécanisme établi pour l'attente d'un insert dans une table ETS si je souhaite l'utiliser pour un état partagé? Je savais qu'un mécanisme similaire serait utile pour un ETS simple afin qu'un processus puisse attendre que les données dont il avait besoin soient chargées. Je pense que la seule façon de faire cela est de faire tourner la boucle et de demander continuellement la clé donnée jusqu'à ce qu'elle arrive, mais cela semble très inefficace. Je préfère recevoir un rappel de message. Si j'insère un processus entre le mien et ETS je viens de pousser le problème sur la ligne.Evénements de la table ETS Erlang

Répondre

2

La solution de contournement la plus simple consiste à démarrer un processus gen_server et de transmettre par proxy toutes les demandes d'insertion. Vous pouvez ensuite enregistrer les rappels en les maintenant dans l'état gen_server et les appeler lorsque la clé insérée correspond au motif. Il pourrait même fonctionner dans une application distincte pour permettre un superviseur dédié.

+1

Je souhaite qu'il y avait un moyen plus rapide que cela avec ETS directement, l'enregistrement d'une autre couche d'indirection et la sérialisation est regrettable. Je vais cependant marquer cette réponse correctement, puisque c'est vraiment la seule façon viable avec ETS. – MattyB

+0

C'est exactement ce que fait Mnesia, et bien d'autres choses, ce qui explique pourquoi c'est moins efficace. La plupart des utilisations de ETS ne nécessitent pas ce que vous aimeriez avoir - notifications par clé insérée. En tant que développeur, je préfère que l'ETS soit léger et (incroyablement) rapide et si j'ai besoin de fonctionnalités supplémentaires, comme les notifications ou quoi que ce soit, il est facile de l'ajouter. Une autre chose est que le surcoût devrait être minime car vous n'avez besoin que de requêtes proxy d'insertion, les demandes de lecture peuvent toujours avoir une fonction dans votre module (pour la cohérence API) mais peuvent simplement appeler les fonctions ETS correspondantes. – Amiramix

1

L'ETS n'a pas de concept d'événement. Cependant, vous pouvez réaliser ce que vous avez décrit en mettant un processus de lecture dans une clause "receive", puis demander à un processus d'écriture d'envoyer un message au lecteur après le chargement des données.

+0

Cela ne fait que railler le problème, car le processus d'écriture doit alors savoir lequel des futurs lecteurs se soucient de l'abonnement aux événements. Pour mon cas d'utilisation, je n'imagine pas être très performant. Je veux créer un groupe de travailleurs dont certains devront attendre que d'autres travailleurs finissent de traiter leurs segments avant de pouvoir commencer. Il n'y a pas de manière évidente de cartographier cette relation avant la main sans sérialiser le travail impliqué. – MattyB

+0

Désolé, il n'était pas clair de votre question que vous avez beaucoup de travailleurs. Dans ce cas, vous avez raison, ce que j'ai suggéré n'est pas la meilleure solution. On dirait que votre meilleur pari est d'écrire un emballage autour d'elle. –

1

Il n'y a pas de gestion des événements dans ets. C'est une fonctionnalité de langage de bas niveau et c'est à vous de faire un wrapper. BTW, Il est comme c'est fait en mnesia. Ainsi, vous pouvez envelopper votre état partagé dans un module, puis vous abonner et vous envoyer.