Handle SIGCHLD properly for multiprocessing
This commit should fix #101 by enabling a special SIGCHLD handler for when multiprocessing is in use. The handler simply calls `multiprocessing.active_children()` (which in turn calls `_cleanup()`) upon receiving a SIGCHLD. Now, the `fallback_SIGCHLD` is only called when `multiprocessing` is not in use. See also #95.
This commit is contained in:
parent
a61ae52610
commit
53f1f1989e
|
|
@ -696,6 +696,9 @@ Sec-WebSocket-Accept: %s\r
|
||||||
def terminate(self):
|
def terminate(self):
|
||||||
raise self.Terminate()
|
raise self.Terminate()
|
||||||
|
|
||||||
|
def multiprocessing_SIGCHLD(self, sig, stack):
|
||||||
|
self.vmsg('Reaing zombies, active child count is %s', len(multiprocessing.active_children()))
|
||||||
|
|
||||||
def fallback_SIGCHLD(self, sig, stack):
|
def fallback_SIGCHLD(self, sig, stack):
|
||||||
# Reap zombies when using os.fork() (python 2.4)
|
# Reap zombies when using os.fork() (python 2.4)
|
||||||
self.vmsg("Got SIGCHLD, reaping zombies")
|
self.vmsg("Got SIGCHLD, reaping zombies")
|
||||||
|
|
@ -796,7 +799,13 @@ Sec-WebSocket-Accept: %s\r
|
||||||
}
|
}
|
||||||
signal.signal(signal.SIGINT, self.do_SIGINT)
|
signal.signal(signal.SIGINT, self.do_SIGINT)
|
||||||
signal.signal(signal.SIGTERM, self.do_SIGTERM)
|
signal.signal(signal.SIGTERM, self.do_SIGTERM)
|
||||||
|
if not multiprocessing:
|
||||||
|
# os.fork() (python 2.4) child reaper
|
||||||
signal.signal(signal.SIGCHLD, self.fallback_SIGCHLD)
|
signal.signal(signal.SIGCHLD, self.fallback_SIGCHLD)
|
||||||
|
else:
|
||||||
|
# make sure that _cleanup is called when children die
|
||||||
|
# by calling active_children on SIGCHLD
|
||||||
|
signal.signal(signal.SIGCHLD, self.multiprocessing_SIGCHLD)
|
||||||
|
|
||||||
last_active_time = self.launch_time
|
last_active_time = self.launch_time
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue