def __init__(self, on_update=None): ''' Constructor @param on_update:()→void Called when a new line is available ''' def noop(): pass self.on_update = noop if on_update is None else on_update (self.master, self.slave) = os.openpty() self.__reader = LineReader(self.master) self.__condition = threading.Condition() self.__queue = [] def background(): try: while True: got = self.__reader.next() if got is None: return self.__condition.acquire() try: self.__queue.append(got) finally: self.__condition.release() self.on_update() except: return self.__thread = threading.Thread(target=background) self.__thread.setDaemon(True) self.__thread.start()
def start(self): with LineReader(spawn(*command)) as reader: reader.next() while True: line = reader.next() self.semaphore.acquire() try: line = line.replace('=', ' ').split(' ') icmp_seq = int(line[line.index('icmp_seq') + 1]) ping_time = float(line[line.index('time') + 1]) ping_time *= Ping.UNITS[line[line.index('time') + 2]] dropped_pkgs = icmp_seq - self.last_icmp_seq - 1 dropped_pkgs = [None] * dropped_pkgs self.last_icmp_seq = icmp_seq self.latency_buffer[:] = ([ping_time] + dropped_pkgs + self.latency_buffer)[:buffer_size] self.last_read = time.monotonic() except: pass finally: self.semaphore.release()
def start(): with LineReader(spawn(*command)) as reader: while True: callback(reader.next())