2015-01-07 3 views
2

Мне нужно открыть файл, который NFS установлен на моем сервере. Иногда NFS-монтирование выходит из строя таким образом, что приводит к блокировке всех файловых операций. Чтобы предотвратить это, мне нужен способ, чтобы функция open в тайм-ауте python после установленного периода. Например. что-то вроде open('/nfsdrive/foo', timeout=5). Конечно, по умолчанию open процедура не имеет timeout или аналогичного ключевого слова.Использовать таймаут, чтобы предотвратить тупик при открытии файла в Python?

Кто-нибудь знает, как эффективно остановить попытку открыть (локальный) файл, если открытие занимает слишком много времени?

Примечание: Я уже пробовал модуль urllib2, но параметры таймаута работают только для веб-запросов, а не локальных.

+1

Вы можете попробовать запустить таймер, который, когда истек, отправляет ваш самый процесс сигналу на этот сигнал и справляется с отказом , или остановите таймер, если работает 'open'. Не уверен, что решение будет работать на Windows, если это ваша платформа - это довольно простой подход ... –

+0

В зависимости от ОС в файле/etc/fstab есть параметр timeo. Я предлагаю вам кук на ваших страницах для этого файла. – cdarke

+1

Если вы используете unix, вы можете использовать флаг O_NONBLOCK с низким уровнем 'os.open', чтобы открыть файл и использовать' select.select', чтобы ждать файла с таймаутом. – Binux

ответ

0

Вы можете попробовать использовать stopit

from stopit import SignalingTimeout as Timeout 

with Timeout(5.0) as timeout_ctx: 
    with open('/nfsdrive/foo', 'r') as f: 
     # do something with f 
     pass 

Там могут быть некоторые проблемы с SignalingTimeout в многопоточных средах (как Django). ThreadingTimeout, с другой стороны, может вызвать проблемы с ресурсами на некоторых виртуальных хостах при запуске слишком большого количества «ограниченных по времени» функций.

P.S. Мой пример также ограничивает время обработки открытого файла. Чтобы ограничить доступ к файлам, вы должны использовать другой подход с ручным открытием/закрытием файлов и ручной обработкой исключений.

Смежные вопросы