+
+class SbyTaskloop:
+ def __init__(self):
+ self.procs_pending = []
+ self.procs_running = []
+ self.tasks = []
+ self.poll_now = False
+
+ def run(self):
+ for proc in self.procs_pending:
+ proc.poll()
+
+ while len(self.procs_running) or self.poll_now:
+ fds = []
+ for proc in self.procs_running:
+ if proc.running:
+ fds.append(proc.p.stdout)
+
+ if not self.poll_now:
+ if os.name == "posix":
+ try:
+ select(fds, [], [], 1.0) == ([], [], [])
+ except InterruptedError:
+ pass
+ else:
+ sleep(0.1)
+ self.poll_now = False
+
+ for proc in self.procs_running:
+ proc.poll()
+
+ for proc in self.procs_pending:
+ proc.poll()
+
+ tasks = self.tasks
+ self.tasks = []
+ for task in tasks:
+ task.check_timeout()
+ if task.procs_pending or task.procs_running:
+ self.tasks.append(task)
+ else:
+ task.exit_callback()
+
+ for task in self.tasks:
+ task.exit_callback()
+
+