fifo - reading in a loop
Question: I want to use [os.mkfifo](http://docs.python.org/2/library/os.html#os.mkfifo)
for simple communication between programs. I have a problem with reading from
the fifo in a loop.

Consider this toy example, where I have a reader and a writer working with the
fifo. I want to be able to run the reader in a loop to read everything that
enters the fifo.

    
    
    # reader.py
    import os
    import atexit
    
    FIFO = 'json.fifo'
    
    @atexit.register
    def cleanup():
        try:
            os.unlink(FIFO)
        except:
            pass
    
    def main():
        os.mkfifo(FIFO)
        with open(FIFO) as fifo:
    #        for line in fifo:              # closes after single reading
    #        for line in fifo.readlines():  # closes after single reading
            while True:
                line = fifo.read()          # will return empty lines (non-blocking)
                print repr(line)
    
    main()
    

And the writer:

    
    
    # writer.py
    import sys
    
    FIFO = 'json.fifo'
    
    
    def main():
        with open(FIFO, 'a') as fifo:
            fifo.write(sys.argv[1])
    
    main()
    

If I run `python reader.py` and later `python writer.py foo`, "foo" will be
printed but the fifo will be closed and the reader will exit (or spin inside
the `while` loop). I want reader to stay in the loop, so I can execute the
writer many times.

**Edit**

I use this snippet to handle the issue:

    
    
    def read_fifo(filename):
        while True:
            with open(filename) as fifo:
                yield fifo.read()
    

but maybe there is some neater way to handle it, instead of repetitively
opening the file...

**Related**

  * [Getting readline to block on a FIFO](http://stackoverflow.com/questions/2406365/getting-readline-to-block-on-a-fifo)


Answer: A FIFO works (on the reader side) exactly this way: it can be read from, until
all writers are gone. Then it signals EOF to the reader.

If you want the reader to continue reading, you'll have to open again and read
from there. So your snippet is exactly the way to go.

If you have mutliple writers, you'll have to ensure that each data portion
written by them is smaller than `PIPE_BUF` on order not to mix up the
messages.

