Can read() be non-blocking?

Thomas Christensen thomasc at thomaschristensen.org
Thu Nov 6 23:54:23 CET 2008


This issue has been raised a couple of times I am sure.  But I have yet
to find a satisfying answer.

I am reading from a subprocess and this subprocess sometimes hang, in
which case a call to read() call will block indefinite, keeping me from
killing it.

The folloing sample code illustrates the problem:

  proc = subprocess.Popen(['/usr/bin/foo', '/path/to/some/file'],
                          stdout=subprocess.PIPE)
  output = StringIO.StringIO()
  while True:
      r = select.select([proc.stdout.fileno()], [], [], 5)[0]
      if r:
          # NOTE: This will block since it reads until EOF
          data = proc.stdout.read()
          if not data:
              break  # EOF from process has been reached
          else:
              output.write(data)
      else:
          os.kill(proc.pid, signal.SIGKILL)
  proc.wait()

  <Process the output...>

As the NOTE: comment above suggests the call to read() will block here.

I see two solutions:

1. Read one byte at a time, meaning call read(1).
2. Read non-blocking.

I think reading one byte at a time is a waste of CPU, but I cannot find
a way to read non-blocking.

Is there a way to read non-blocking?  Or maybe event a better way in
generel to handle this situation?

Thanks

		Thomas




More information about the Python-list mailing list