From e783d7c1faacdf23fc54538e237237a7c300ac29 Mon Sep 17 00:00:00 2001 From: Natalia Serrano Date: Thu, 31 Jul 2025 10:34:01 +0200 Subject: [PATCH] refs #2554 wait for zombies --- src/opengnsys/workers/oglive_worker.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/opengnsys/workers/oglive_worker.py b/src/opengnsys/workers/oglive_worker.py index 6381dfc..e753f5c 100644 --- a/src/opengnsys/workers/oglive_worker.py +++ b/src/opengnsys/workers/oglive_worker.py @@ -35,6 +35,7 @@ import re import time try: import dbus ## don't fail on windows (the worker will later refuse to load anyway) except: pass +import select import random import subprocess import threading @@ -292,22 +293,26 @@ class ogLiveWorker(ServerWorker): pass sout = serr = '' - poll_iterations = 1 - while p.poll() is None: - for l in iter (p.stdout.readline, b''): + finished = False + while True: + try: + p.wait (0.05) + finished = True + except subprocess.TimeoutExpired: + pass + + ready_to_read, _, _ = select.select ([p.stdout, p.stderr], [], [], 0.2) + if p.stdout in ready_to_read: + l = p.stdout.readline() partial = l.decode ('utf-8', 'ignore') if self.stdout_q: self.stdout_q.put (partial) sout += partial - for l in iter (p.stderr.readline, b''): + if p.stderr in ready_to_read: + l = p.stderr.readline() partial = l.decode ('utf-8', 'ignore') serr += partial - ## poll quickly at first, then poll less frequently - if poll_iterations > 15: sleep_time = 1 - elif poll_iterations > 10: sleep_time = 0.2 - else: sleep_time = 0.1 - time.sleep (sleep_time) - poll_iterations += 1 + if finished: break sout = sout.strip() serr = serr.strip()