I was trying to understand FIFOs using Python under linux and I found a strange behavior i don't understand.
The following is fifoserver.py
import sys
import time
def readline(f):
s = f.readline()
while s == "":
time.sleep(0.0001)
s = f.readline()
return s
while True:
f = open(sys.argv[1], "r")
x = float(readline(f))
g = open(sys.argv[2], "w")
g.write(str(x**2) + "\n")
g.close()
f.close()
sys.stdout.write("Processed " + repr(x) + "\n")
and this is fifoclient.py
import sys
import time
def readline(f):
s = f.readline()
while s == "":
time.sleep(0.0001)
s = f.readline()
return s
def req(x):
f = open("input", "w")
f.write(str(x) + "\n")
f.flush()
g = open("output", "r")
result = float(readline(g))
g.close()
f.close()
return result
for i in range(100000):
sys.stdout.write("%i, %s\n" % (i, i*i == req(i)))
I also created two FIFOs using mkfifo input
and mkfifo output
.
What I don't understand is why when I run the server (with python fifoserver.py input output
) and the client (with python fifoclient.py
) from two consoles after some requests the client crashes with a "broken pipe" error on f.flush()
. Note that before crashing I've seen from a few hundreds to several thousands correctly processed requests running fine.
What is the problem in my code?
sys.argv[2]
and never closing it. Don't assume the garbage collector will take care of that for you -- clean it up explicitly with a call toclose()
, or better yet, use awith
statement. – Bostowf = open(...)
uses the namef
for a new file object, thereby dropping the last reference to the old one. The old file object gets garbage collected immediately, which includes that it is closed. – Nadabus