Re: [Python-Dev] cpython: Fix closes issue #11109 - socketserver.ForkingMixIn leaves zombies, also fails

On Wed, 25 May 2011 18:26:46 +0200 senthil.kumaran <python-checkins@python.org> wrote:
A new method called service_action is made available in BaseServer, called by serve_forever loop. This useful in cases where Mixins can use it for cleanup action. ForkingMixin class uses service_action to collect the zombie child processes. Initial Patch by Justin Wark.
Is it reasonable, performance-wise, to do this at every iteration of the loop (that is, at every incoming connection)? Regards Antoine.

A new method called service_action is made available in BaseServer, called by serve_forever loop. This useful in cases where Mixins can use it for cleanup action. ForkingMixin class uses service_action to collect the zombie child processes. Initial Patch by Justin Wark.
Is it reasonable, performance-wise, to do this at every iteration of the loop (that is, at every incoming connection)?
I haven't measured it, but it's O(N) where N is the number of children. It should be possible to optimize this by putting all the children in a process group (the other advantage is that we wouldn't wait() children not spawned by socketserver). cf

Antoine Pitrou wrote:
A new method called service_action is made available in BaseServer, called by serve_forever loop. This useful in cases where Mixins can use it for cleanup action. ForkingMixin class uses service_action to collect the zombie child processes. Initial Patch by Justin Wark.
Is it reasonable, performance-wise, to do this at every iteration of the loop (that is, at every incoming connection)?
If not here, the call was being done at the process_request level when creating a new child process and the wait would have been there. I am not sure, how much performance different (lag) this aggressive collection can bring. Charles-François Natali wrote:
I haven't measured it, but it's O(N) where N is the number of children. It should be possible to optimize this by putting all the children in a process group (the other advantage is that we wouldn't wait() children not spawned by socketserver).
+1. This is definitely a good idea. The change needs to be done in the collection_children routine which tries to wait for all children to finish instead of just the ones forked by the socketserver. Shall raise ticket for this. -- Senthil Although the moon is smaller than the earth, it is farther away.
participants (3)
-
Antoine Pitrou
-
Charles-François Natali
-
Senthil Kumaran