2010-03-10 41 views
6

J'ai un morceau de code où je reproduis des processus enfants pour le rendre plus efficace. Cependant, ils semblent créer toutes sortes de processus zombies qui bloquent les sockets et font tomber le site.Processus de zombies apparaissant lorsque je reproduis des processus

spawn(:method => :thread) do 
    if @login_user.suggested_group_info.new_record? 
     xxx 
    end 
end 

1) Pourquoi créer des processus zombies? 2) Comment puis-je écrire le code de telle sorte que je m'assure que je tue le processus avant qu'il ne devienne un zombie?

Répondre

4

Vous devez enregistrer le PID du processus généré et exécuter l'appel système waitpid (2) après sa mort. (Je ne sais pas comment Ruby fait cela.)

+2

Ruby fait cela à peu près comme on pouvait s'y attendre. spawn renvoie un pid; un appel à Process.waitpid (pid) attend le processus pour quitter, puis récupère le zombie. –

0

Vous pouvez également piège pour l'arrêt de l'enfant qui nettoiera le processus zombie

trap("CLD") { 
    pid = Process.wait 
    puts "Child pid #{pid}: terminated" 
}