2 votes

Otp application:stop(..) tue tous les processus créés, et pas seulement ceux liés à spawn ?

J'ai mis en place un cas de test simple à l'adresse suivante https://github.com/bvdeenen/otp_super_nukes_all qui montre qu'une application otp:stop() tue en fait tous les processus créés par ses enfants, même ceux qui sont en cours d'exécution. non lié .

Le cas de test consiste en un gen_server (enregistré comme par) qui engendre un processus erlang simple (enregistré comme par_worker) et un gen_server (enregistré comme reg_child), qui engendre également un processus erlang simple (enregistré comme child_worker). L'appel à application:stop(test_app) provoque une terminaison normale sur le gen_server 'par', mais un exit(kill) sur tous les autres !

S'agit-il d'un comportement nominal ? Si oui, où est-il documenté et puis-je le désactiver ? Je veux que les processus que je crée à partir de mon gen_server (pas de lien) restent en vie lorsque l'application se termine.

Remerciements

Bart van Deenen

5voto

marcelog Points 3234

En application (pour la fonction stop/1) :

Last, the application master itself terminates. Note that all processes with the
application master as group leader, i.e. processes spawned from a process belonging
to the application, thus are terminated as well.

Je suppose donc qu'il n'est pas possible de modifier ce comportement.

EDIT : Vous pourriez être en mesure de changer le group_leader du processus démarré avec group_leader(GroupLeader, Pid) -> true (voir : http://www.erlang.org/doc/man/erlang.html#group_leader-2 ). Changer le group_leader peut vous permettre d'éviter de tuer votre processus lorsque l'application se termine.

0voto

allenhwkim Points 6012

J'ai également commis ces erreurs et j'ai découvert que cela devait arriver.

Si le processus parent meurt, tous les processus enfants meurent, qu'ils soient enregistrés ou non.

Si ce n'est pas le cas, nous devons suivre tous les processus en cours d'exécution et déterminer lesquels sont orphelins et lesquels ne le sont pas. On peut penser aux ppid et pid d'Unix. Si l'on tue le ppid, tous les enfants meurent aussi. Je pense que c'est ce qui doit se passer.

Si vous souhaitez que les processus soient indépendants de votre application, vous pouvez envoyer un message à une autre application pour lancer des processus.

other_application_module:start_process(ProcessInfo).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X