code: def _proc_iteroutput_thread(proc):
      
      from six.moves import queue
  
      # Create threads that read stdout / stderr and queue up the output
      stdout_queue = _proc_async_iter_stream(proc, proc.stdout)
      stderr_queue = _proc_async_iter_stream(proc, proc.stderr)
  
      stdout_live = True
      stderr_live = True
  
      # read from the output asynchronously until
      while stdout_live or stderr_live:
          if stdout_live:  # pragma: nobranch
              try:
                  oline = stdout_queue.get_nowait()
                  stdout_live = oline is not None
              except queue.Empty:
                  oline = None
          if stderr_live:
              try:
                  eline = stderr_queue.get_nowait()
                  stderr_live = eline is not None
              except queue.Empty:
                  eline = None
          if oline is not None or eline is not None:
              yield oline, eline
docs: Iterates over output from a process line by line
  
      Note:
          WARNING. Current implementation might have bugs with other threads.
          This behavior was seen when using earlier versions of tqdm. I'm not
          sure if this was our bug or tqdm's. Newer versions of tqdm fix this,
          but I cannot guarantee that there isn't an issue on our end.
  
      Yields:
          Tuple[str, str]: oline, eline: stdout and stderr line
  
      References:
          https://stackoverflow.com/questions/375427/non-blocking-read-subproc