def run(self):
poll = select.poll()
poll.register(self._read_fd, select.POLLIN | select.POLLPRI | select.POLLHUP)
poll.register(self._quit_pipe, select.POLLHUP)
reader = LineReader()
def process_line(readbytes):
reader.append(readbytes)
line = reader.readline()
if line is None:
return
if self._next_flag.is_set():
self._lines.put(line)
self._next_flag.clear()
reader.skiplines()
self._processed.set()
while True:
events = poll.poll()
if not events:
continue
for e in events:
fd, ev = e[0], e[1]
if fd == self._quit_pipe and (ev & select.POLLHUP) != 0:
# quit
return
elif fd == self._read_fd and (ev & (select.POLLIN | select.POLLPRI)) != 0:
# there are some data
readbytes = os.read(fd, 1024)
if not readbytes:
# EOF
return
process_line(readbytes)
elif fd == self._read_fd and (ev & select.POLLHUP) != 0:
# read_fd closed
return
else:
self.log(msg)
评论列表
文章目录