IOError: [Errno 24] Слишком много открытых файлов - но я закрываю все файлы - PullRequest
0 голосов
/ 25 декабря 2018

Я читаю каждый файл 0.01sa, но я делаю это с

with open('file.txt','r') as FILE:
    data = FILE.read()

, что должно быть в соответствии с официальной документацией, кроме способа открытия и закрытия файла.

В то же времяЯ записываю в один и тот же файл время от времени (2–20 с) тем же способом, но с флагом «w» - но из совершенно другого процесса Python

Примерно через 20 минут правильной работы я получаю эту ошибку

IOError: [Errno 24] Too many open files:

Я думаю, что это совершенно нелепая ошибка.Произошла одна интересная вещь, которую я вынужден упомянуть здесь.Поскольку это происходит в моем Raspberry Pi, и не было никаких причин ожидать этой ошибки, я не покрывал ошибки с LOG.Поэтому я попытался зарегистрировать ошибку, и произошло нечто странное:

while True:
    ...
    #loop where I read every 0.01 a file, IOError of the reading file happens
    ...
    except Exception as e: # log the IOEerror
        with open('log_error.txt','w') as FILE: # Cacthes the error but triggers a new IOError
            FILE.write(e)

После того, как произошла IOError, в Exception произошла новая ошибка, и вместо IOError чтения файла я получил IOError для регистрации ошибки в log_error.txt

Кто-нибудь знает, что происходит?Я не могу понять это, так как он падает после 20 минут до 2 часов (это означает, что минимально файл был открыт по крайней мере 20 * 60 / 0,01, и ошибки не возникает).Это просто работает, пока это не так.Спасибо за любой совет

РЕДАКТИРОВАТЬ - Код: У меня есть подписчик MQTT, который получает команды (запись в файл по пути: self.path_anim_current)

if payload['request']=='write_in':
    with open(self.path_anim_current,'w') as FILE:
        FILE.write(payload['data'])

В другом процессеЯ пытаюсь поймать изменение в файле как можно быстрее - это цикл чтения 0,01 с, где я читаю файл в self.path_anim_current

Это фрагмент цикла чтения 0,01 с: PATH = self.path_anim_current

with open(PATH,'r') as FILE:
        ANIMATION = FILE.read()
if ANIMATION != '':
    COMMAND = rc.process_json(str(ANIMATION))
    with open(PATH,'w') as FILE:
        FILE.write('') #**On reading the file I want to delete its content**

rc.process_json - это просто функция, которая загружает файл json с некоторыми настройками

чтение json стандартным образом

with open('path_to_some_config') as FILE:
        DOCUMENT = json.load(FILE)
...