Si un module A a une méthode SOMEMETHOD (). Si cette méthode est engendrée sous forme de thread à partir de ce module A, et si le code à l'intérieur de SOMEMETHOD () est une boucle infinie, alors dans ce cas, si le module A tombe en panne, le fil engendré s'exécutera "SOMEMETHOD" va également tomber? < / p>
Fondamentalement, je veux savoir s'il y a plusieurs threads engendrés à partir d'un module, et si ce module diminue, ces threads allumés seront-ils automatiquement abattus? ou ils continueront à courir (en supposant que le code est exécuté par ces threads est et une boucle infinie) p>
3 Réponses :
dans Erlang, le processus A génisse l'autre processus B. Selon les comportements que vous voulez b Continuez do ... Si le processus B fait le travail qui ne concerne pas les données ou les besoins communiqués pour traiter un tel que des liens A et B ou moniteur A, le processus B fera toute chose pour vous et ne vous souciez pas du processus A. P>
C'est une raison pour laquelle certains grands systèmes de télécommunication ont un comportement d'automate / de prise de contrôle pour résoudre ce problème. Ils ont besoin que 2 processus principaux fonctionnent parallèlement et surveiller mutuellement. Par exemple: A est Sub et B est principal, tous deux ensemble surveiller les processus de milliers de fils (S1, S2, S3 ...). P>
Lorsque le processus B Obtenez un problème, le processus A prendra immédiatement des données du processus et continuez ce que leur fils puis de redémarrer le processus B. Tous dépendent de quel comportement de votre application que vous souhaitez construire p>
Les modules ne tombent pas. Processus faire. Les modules pourraient être purgés à partir de la mémoire si vous avez plus qu'une nouvelle version chargée, puis tous les processus qui gèrent l'ancienne version seront tués, mais ce n'est pas ce que vous avez demandé. Les modules ne tombent pas. Processus font. P>
Si vous demandez:
Si j'apprends deux processus qui exécutent la même fonction dans un module, et le premier processus meurt, le deuxième processus meurt-il également? p> blockQuote>
Essayez ceci: p>
xxx pré> dans la coque: p>
xxx pré> après la sortie de sortie, rapidement émettre la commande
i () code> (info) dans la coque: p>
xxx pré> au bas de la sortie ci-dessus, vous pouvez voir que
My: get_divisor / 2 code> est en cours d'exécution dans le processus
code> ainsi que dans le processus
code>. Et, si vous regardez la sortie de la ligne IEX
2> CODE>, vous pouvez voir: p>
xxx pré> qui confirme que ce sont les processus que les processus Test () Code> Fonction engendré. P>
La sortie des deux processus de génie continue: P>
xxx pré> La dernière ligne indique que le processus code>, c'est-à-dire que le processus
harry code> a eu une erreur, mais la sortie de Sally continue de: p>
xxx pré> la dernière ligne ci-dessus montre que maintenant le processus
code>, c'est-à-dire le processus
sally code>, avait une erreur. p>
Si vous utilisez le
i () commande code> à nouveau, vous verrez qu'aucun des processus
code> et
code> est en cours d'exécution. P>
shell process = <0.64.0> ... ... harry's pid = <0.71.0> sally's pid = <0.72.0> 3> i(). =ERROR REPORT==== 10-May-2019::21:17:19 === Error in process <0.71.0> with exit value: {badarith,[{my,get_divisor,2,[{file,"my.erl"},{line,5}]}]} 3> i(). Pid Initial Call Heap Reds Msgs Registered Current Function Stack <0.0.0> otp_ring0:start/2 376 990 0 init init:loop/1 2 <0.1.0> erts_code_purger:start/0 233 11 0 erts_code_purger erts_code_purger:wait_for_request 0 <0.2.0> erts_literal_area_collector:start 233 3 0 erts_literal_area_collector:msg_l 5 <0.3.0> erts_dirty_process_code_checker:s 233 3 0 erts_dirty_process_code_checker:m 1 <0.6.0> erlang:apply/2 6772 714804 0 erl_prim_loader erl_prim_loader:loop/3 5 <0.32.0> gen_event:init_it/6 1598 1848 0 error_logger gen_event:fetch_msg/6 10 <0.33.0> erlang:apply/2 1598 954 0 application_controlle gen_server:loop/7 7 <0.35.0> application_master:init/4 233 69 0 application_master:main_loop/2 7 <0.36.0> application_master:start_it/4 233 90 0 application_master:loop_it/4 5 <0.37.0> supervisor:kernel/1 987 2202 0 kernel_sup gen_server:loop/7 10 <0.38.0> erlang:apply/2 6772 142113 0 code_server code_server:loop/1 3 <0.40.0> rpc:init/1 233 32 0 rex gen_server:loop/7 10 <0.41.0> global:init/1 233 63 0 global_name_server gen_server:loop/7 10 <0.42.0> erlang:apply/2 233 25 0 global:loop_the_locker/1 5 <0.43.0> erlang:apply/2 233 3 0 global:loop_the_registrar/0 2 <0.44.0> inet_db:init/1 233 350 0 inet_db gen_server:loop/7 10 <0.45.0> global_group:init/1 233 74 0 global_group gen_server:loop/7 10 <0.46.0> file_server:init/1 1598 3436 0 file_server_2 gen_server:loop/7 10 <0.47.0> gen_event:init_it/6 233 51 0 erl_signal_server gen_event:fetch_msg/6 10 <0.48.0> supervisor_bridge:standard_error/ 233 50 0 standard_error_sup gen_server:loop/7 10 <0.49.0> erlang:apply/2 233 11 0 standard_error standard_error:server_loop/1 2 <0.50.0> supervisor_bridge:user_sup/1 233 72 0 gen_server:loop/7 10 <0.51.0> user_drv:server/2 2586 12209 0 user_drv user_drv:server_loop/6 9 <0.52.0> group:server/3 233 101 0 user group:server_loop/3 4 <0.53.0> group:server/3 318187 86312 0 group:server_loop/3 4 <0.54.0> kernel_config:init/1 233 48 0 gen_server:loop/7 10 <0.55.0> supervisor:kernel/1 376 282 0 kernel_safe_sup gen_server:loop/7 10 <0.59.0> supervisor:disk_log_sup/1 233 147 0 disk_log_sup gen_server:loop/7 10 <0.60.0> disk_log_server:init/1 610 91 0 disk_log_server gen_server:loop/7 10 <0.61.0> disk_log:init/2 6772 37458 0 disk_log:loop/1 5 <0.63.0> erlang:apply/2 17731 4978 0 shell:shell_rep/4 17 <0.74.0> erlang:apply/2 318187 39091 0 c:pinfo/1 50 Total 688344 1047971 0 273 ok 4>