Я пытался понять FIFO, используя Python под Linux, и обнаружил странное поведение, которого не понимаю.
Далее 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)))
Я также создал два FIFO, используя mkfifo input
и mkfifo output
.
Чего я не понимаю, так это почему, когда я запускаю сервер (с python fifoserver.py input output
) и клиент (с python fifoclient.py
) с двух консолей, после некоторых запросов клиент вылетает с ошибкой "сломан канал" на f.flush()
. Обратите внимание, что перед сбоем я видел от нескольких сотен до нескольких тысяч правильно обработанных запросов, которые работали нормально.
В чем проблема в моем коде?
sys.argv[2]
и никогда не закрываете его. Не думайте, что сборщик мусора позаботится об этом за вас — очистите его явным образом с помощью вызоваclose()
или, что еще лучше, используйте операторwith
. - person Adam Rosenfield   schedule 23.02.2011f = open(...)
использует имяf
для нового файлового объекта, тем самым удаляя последнюю ссылку на старый. Старый файловый объект немедленно подвергается сборке мусора, включая его закрытие. - person Sven Marnach   schedule 23.02.2011