|
@@ -44,9 +44,17 @@ class DynamicPool(Pool):
|
|
|
"""Returns the process id's of all the pool workers."""
|
|
|
return [process.pid for process in self.processes]
|
|
|
|
|
|
+ def is_alive(self, process):
|
|
|
+ try:
|
|
|
+ proc_is_alive = process.is_alive()
|
|
|
+ except OSError:
|
|
|
+ return False
|
|
|
+ else:
|
|
|
+ return proc_is_alive
|
|
|
+
|
|
|
def replace_dead_workers(self):
|
|
|
dead = [process for process in self.processes
|
|
|
- if not process.is_alive()]
|
|
|
+ if not self.is_alive(process)]
|
|
|
if dead:
|
|
|
dead_pids = [process.pid for process in dead]
|
|
|
self._pool = [process for process in self._pool
|
|
@@ -88,8 +96,10 @@ class PoolSupervisor(object):
|
|
|
|
|
|
"""
|
|
|
|
|
|
- def __init__(self, target, max_restart_freq=MAX_RESTART_FREQ,
|
|
|
- max_restart_freq_time=MAX_RESTART_FREQ_TIME):
|
|
|
+ def __init__(self, target, logger=None,
|
|
|
+ max_restart_freq=MAX_RESTART_FREQ,
|
|
|
+ max_restart_freq_time=MAX_RESTART_FREQ_TIME):
|
|
|
+ self.logger = logger or multiprocessing.get_logger()
|
|
|
self.target = target
|
|
|
self.max_restart_freq = max_restart_freq * len(target.processes)
|
|
|
self.max_restart_freq_time = max_restart_freq_time
|
|
@@ -107,11 +117,14 @@ class PoolSupervisor(object):
|
|
|
return True
|
|
|
self.restart_frame_time = time.time()
|
|
|
return False
|
|
|
-
|
|
|
|
|
|
def supervise(self):
|
|
|
+ self.logger.debug("PoolSupervisor: Finding dead worker processes...")
|
|
|
dead = self.target.replace_dead_workers()
|
|
|
if dead:
|
|
|
+ self.logger.info(
|
|
|
+ "PoolSupervisor: Replaced %s dead pool workers..." % (
|
|
|
+ len(dead)))
|
|
|
self.restarts_in_frame += len(dead)
|
|
|
if self.restart_freq_exceeded():
|
|
|
raise MaxRestartsExceededError(
|