J'utilise le comportement du superviseur OTP pour superviser et redémarrer les processus enfants. Cependant, lorsque l'enfant meurt, je veux le redémarrer avec le même état qu'il avait avant le crash. p>
Si j'écris mon propre superviseur personnalisé, je peux juste recevoir {sortie, pid, raison} message et agir sur elle. Lorsque vous utilisez le comportement du superviseur OTP, mais il est géré par OTP et je n'ai aucun contrôle dessus. La seule fonction de rappel i est init. p>
Y a-t-il une approche standard dans le cas de cela? Comment personnaliser l'état d'un enfant étant redémarré de manière dynamique par le superviseur OTP? Comment obtenir PID du processus de terminaison en utilisant OTP? Ou peut-être qu'il est possible d'obtenir l'état de l'enfant juste avant la résiliation, puis restaurer l'enfant au même état qu'il avait précédé de s'écraser? p>
3 Réponses :
Sans connaître aucun détail sur ce que vous faites, je peux imaginer un monde où ce qui suit a du sens: p>
Donc, si j'avais 12 processus d'enfants représentant les 12 tribus de Cobol utiliserait chacun son nom comme la clé de la table ET pour rechercher l'état laissé par une précédente incarnée au début. Et chaque processus mettrait à jour le tableau (à nouveau en utilisant son nom comme clé) chaque fois que son état a changé. P>
Le superviseur redémarrera automatiquement un enfant tué et une étape 2 ci-dessus, serait exécuté dans la méthode init de l'enfant. L'étape 3 serait traitée dans les méthodes de la poignée_call des enfants, de la poignée et du gare_info (je fais des hypothèses sur la nature de vos processus). Un certain nombre de stratégies de redémarrage sont disponibles via le superviseur qui peut même redémarrer les frères et sœurs si désiré. P>
J'espère que cela vous donne des pensées. p>
éventuellement redémarrer avec le même état n'est pas une bonne idée. Probablement mauvais processus d'état d'état d'état de crash et si vous redémarrez avec le même état, il se bloquera à nouveau. Mais si vous le souhaitez, utilisez la ressource externe pour le garder (comme ETS ou MNSIA). P>
Je pense que ce type de personnalisations du comportement du superviseur OTP ne peut pas être fait facilement. La façon dont les superviseurs OTP sont conçues me force à suivre certaines pratiques de conception strictes. Le plus important dans ce cas est que le superviseur ne devrait rien faire d'autre en dehors de la surveillance de ses enfants et de les redémarrer en cas de résiliation anormale. Il ne devrait y avoir aucune logique supplémentaire dans le superviseur de ne pas introduire de bugs dans les superviseurs qui font partie essentielle de l'arborescence de la supervision et de la tolérance aux pannes.
Comment obtenir PID du processus de terminaison à l'aide de OTP? strong>
- Dans le processus supplémentaire qui commence les enfants via superviseur: start_child Vous pouvez les surveiller, puis écouter des messages vers le bas. Par exemple, dans le cas de GEN_SERVER, vous utiliseriez la fonction GRAND_INFO comme ci-dessous: P> handle_info({'DOWN', Ref, process, _Pid, _}, S) ->
handle_down_worker(Ref, _Pid, S).
Dupliqué possible de Redémarrer le processus Erlang et l'état de conservation