2010-03-10 15 views
6

Ich habe ein Stück Code, wo ich Kinder Prozesse spawn, um es effizienter zu machen. Sie scheinen jedoch alle Arten von Zombie-Prozessen zu erzeugen, die Sockets blockieren und die Seite zum Absturz bringen.Zombie-Prozesse erscheinen, wenn ich Prozesse spawne

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

1) Warum entstehen Zombieprozesse? 2) Wie könnte ich den Code so schreiben, dass ich sicher bin, dass ich den Prozess erledige, bevor es ein Zombie wird?

Antwort

4

Sie müssen die PID des erzeugten Prozesses speichern und den Systemaufruf waitpid (2) nach dem Absturz ausführen. (Ich weiß nicht, wie Rubin dies der Fall ist.)

+2

Rubin dies tut so ziemlich wie man erwarten würde. Spawn gibt eine PID zurück; Ein Aufruf von Process.waitpid (pid) wartet darauf, dass der Prozess beendet wird, und erntet dann den Zombie. –

0

Sie können auch Falle für das Kind Abschaltung, die den Zombie-Prozess aufräumt

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