Сторожевой таймер ЦП/использование энергии

Я пытаюсь создать простое переименование файлов с помощью сторожевого таймера в python, это очень просто, любой созданный файл «xlsx» будет переименован в «Base.xslx».

Я получил это быстро, используя приведенный ниже код, но при работе он использует много ресурсов ЦП и энергии, что-то не так с самим кодом или это нормально?

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import time
import os

fp = 'C:/yourpath/'

class ExampleHandler(FileSystemEventHandler):
    def on_created(self, event):
        time.sleep(1)
        for file_name in os.listdir(fp):
            if '.xlsx' in file_name:
                name=fp+file_name
                os.rename(name,"Base.xlsx")


observer = Observer()
event_handler = ExampleHandler() 
observer.schedule(event_handler, path=fp)
observer.start()


try:
    while True:
        time.sleep(0)
except KeyboardInterrupt:
    observer.stop()

observer.join()

person Adriano Ribeiro    schedule 23.05.2020    source источник
comment
Тоже ищу ответ! :)   -  person ProtractorNewbie    schedule 01.07.2020
comment
Тоже интересует эта проблема. Насколько экспансивным является «/yourpath/»? Если существует огромное количество существующих файлов, я предполагаю, что это необходимое снижение производительности?   -  person Justin Palmer    schedule 12.07.2020
comment
Привет, Джастин, мой путь - это путь к диску с несколькими подпапками, файлами и большим именем пути, но я не думаю, что это причина, потому что я пробовал с простыми путями. как D:/foo и D:/bar и получил огромное количество использования.   -  person Adriano Ribeiro    schedule 13.07.2020


Ответы (1)


Мне кажется, что time.sleep(0) это одна из проблем. Класс Observer основан на событиях, поэтому он не отслеживает папку в соответствии с параметром сна в бесконечном цикле, но будет запускать метод обработчика, как только событие поступит из ОС.

Этот бесконечный цикл использует все ядро ​​​​ЦП (как обычно делают пустые бесконечные циклы), поэтому вы должны изменить параметр time.sleep() на 1 (или что-то еще большее, это не имеет значения, так как KeyboardInterrupt прервет метод сна независимо от его ' длина').

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

person Domonkos Bálint    schedule 18.10.2020