Вероятность ошибки ввода-вывода при печати и записи - PullRequest
2 голосов
/ 04 мая 2010

Я недавно столкнулся с IOError, записывающей файл в NFS. Не было места на диске или проблемы с разрешениями, поэтому я предполагаю, что это был просто сбой в работе сети. Очевидное решение состоит в том, чтобы заключить запись в попытку-исключение, но мне было любопытно, будет ли реализация print и write в Python более или менее вероятным вызвать IOError:

f_print = open('print.txt', 'w')
print >>f_print, 'test_print'
f_print.close()

против

f_write = open('write.txt', 'w')
f_write.write('test_write\n')
f_write.close()

(Если это имеет значение, особенно в Python 2.4 для Linux).

1 Ответ

1 голос
/ 04 мая 2010

распечатки реализованы с точки зрения записи, что в итоге приводит к вызову write (2) в ядро. Вы можете запустить strace на этих двух сэмплах и (после просмотра большого количества мусора) увидеть одинаковые результирующие вызовы для записи (2).

Действительно, я только что сделал это, и пропустив более 2000 строк, мы получили:

execve("/usr/bin/python", ["python", "a.py"], [/* 43 vars */]) = 0
open("print.txt", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
write(3, "test_print\n", 11)            = 11
close(3)                                = 0

и

execve("/usr/bin/python", ["python", "b.py"], [/* 43 vars */]) = 0
open("write.txt", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
write(3, "test_write\n", 11)            = 11
close(3)                                = 0

Не так много различий, чтобы увидеть там. Независимо от того, находится ли файл назначения на локальном диске или монтируется NFS, вызов write () будет одинаковым. Часто называемая файловая система Nightmare, при прочих равных условиях, будет выходить из строя чаще, чем ваш локальный диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...