diff options
Diffstat (limited to 'openstack')
-rw-r--r-- | openstack/common/service.py | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/openstack/common/service.py b/openstack/common/service.py index 0df0dec..740378f 100644 --- a/openstack/common/service.py +++ b/openstack/common/service.py @@ -243,7 +243,10 @@ class ProcessLauncher(object): def _wait_child(self): try: - pid, status = os.wait() + # Don't block if no child processes have exited + pid, status = os.waitpid(0, os.WNOHANG) + if not pid: + return None except OSError as exc: if exc.errno not in (errno.EINTR, errno.ECHILD): raise @@ -275,6 +278,10 @@ class ProcessLauncher(object): while self.running: wrap = self._wait_child() if not wrap: + # Yield to other threads if no children have exited + # Sleep for a short time to avoid excessive CPU usage + # (see bug #1095346) + eventlet.greenthread.sleep(.01) continue while self.running and len(wrap.children) < wrap.workers: |