我正在尝试在Linux下使用Python理解FIFO,但是发现了一种奇怪的行为,我不太理解。
以下是fifoserver.py的内容:
我还使用
我不明白的是,为什么当我在两个控制台中运行服务器(使用
我的代码有什么问题?
以下是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")
以下是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)))
我还使用
mkfifo input
和mkfifo output
创建了两个FIFO。我不明白的是,为什么当我在两个控制台中运行服务器(使用
python fifoserver.py input output
)和客户端(使用python fifoclient.py
)进行一些请求后,客户端会因f.flush()
出现“broken pipe”错误而崩溃。请注意,在崩溃之前,我已经看到了几百个到数千个正确处理的请求正在运行良好。我的代码有什么问题?
sys.argv[2]
,但从未关闭。不要假设垃圾回收器会为你处理它 -- 用调用close()
显式清理,或更好地使用with
语句。 - Adam Rosenfieldf = open(...)
使用名称f
来创建一个新的文件对象,从而丢弃了旧对象的最后一个引用。旧的文件对象立即被垃圾回收,这包括它被关闭。 - Sven Marnach