J'ai des processus de travail qui ont besoin de données collectées/calculées comme arguments au démarrage. Ceci est également nécessaire lors des redémarrages. Où dois-je mettre le code d'initialisation? À l'intérieur des superviseurs init? Ou à l'intérieur des modules start_link, ou init? Y a-t-il des bonnes pratiques à Erlang quand il s'agit de cela?Persistance des données lorsque le processus de travail meurt, comment?
2
A
Répondre
2
Si le composant gen_server a un état critique, ou un état qui ne peut pas être recalculé/recollé, j'évite généralement de conserver l'état dans gen_server lui-même. Je choisis à la place de maintenir l'état dans une table externe de processus/ets. Si vous utilisez cette approche, assurez-vous que la table ets est créée par un processus externel (dont vous êtes sûr qu'il ne mourra pas), par exemple, le processus d'application -ou-- créez la table ets dans la méthode init du gen_server et utilisez la méthode "ets: give_away/3" pour la remettre à un processus externe (bien sûr, vous devrez vérifier si la table est déjà créée dans la méthode init de gen_server). Sinon, la table ets sera détruite Quand le processus se termine-t-il?
Pouvez-vous donner plus de détails: lors des redémarrages voulez-vous recomposer/recalculer les arguments ou voulez-vous garder les arguments stockés quelque part et les réutiliser? La meilleure pratique dépend du cas d'utilisation exact que je crains. –
J'ajouterais aussi que je pense que les données du superviseur devraient être de type plus constant. Je ne ferais pas de travail d'initialisation à grande échelle chez le superviseur à moins que ce ne soit quelque chose qui soit utile à tous/la plupart de ses travailleurs. Les données pour un travailleur je laisserais à son initialisation. Juste mon avis cependant. – rvirding
Oui merci, je suppose que les questions sur les «meilleures pratiques» seront difficiles à répondre parfois sans donner une opinion personnelle. Utile quand même. – JoGr