Сколько ЦП должен использовать вызов Python time.sleep(n)

У меня есть программа, работающая на старом ноутбуке, которая постоянно отслеживает папку Dropbox на предмет добавления новых файлов. Когда он работает, процесс Python использует около 50% ЦП на двухъядерной машине и около 12% на 8-ядерной машине, что предполагает, что он использует почти 100% одного ядра). Это отдает много тепла.

Соответствующий бит кода:

while True:
    files = dict ([(f, None) for f in os.listdir(path_to_watch)])
    if len(files) > 0:
        print "You have %s new file/s!" % len(files)
        time.sleep(20)

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

Итак два вопроса:

1) Так как time.sleep() не должен сильно нагружать ЦП, что здесь происходит?

2) Есть ли другой способ мониторинга папки на наличие изменений, который будет работать круче?


person Jamie Bull    schedule 01.08.2013    source источник
comment
Ваш time.sleep имеет слишком большой отступ, поместите его в основной блок while True, это гарантирует, что он всегда будет работать.   -  person Wessie    schedule 01.08.2013


Ответы (2)


1) Ваш сон вызывается только при появлении новых файлов.

Это должно быть намного лучше:

while True:
    files = dict ([(f, None) for f in os.listdir(path_to_watch)])
    if len(files) > 0:
        print "You have %s new file/s!" % len(files)
    time.sleep(20)

2) Да, особенно если вы используете Linux. Гамин был бы тем, на что я бы порекомендовал обратить внимание.

Пример:

import gamin
import time
mydir = /path/to/watch
def callback(path, event):
    global mydir
    try:
        if event == gamin.GAMCreated:
            print "New file detected: %s" % (path)
            fullname = mydir + "/" + path
            print "Goint to read",fullname
            data = open(fullname).read()
            print "Going to upload",fullname
            rez = upload_file(data,path)
            print "Response from uploading was",rez
    except Exception,e: #Not good practice
        print e
        import pdb
        pdb.set_trace()


mon = gamin.WatchMonitor()
mon.watch_directory(mydir, callback)
time.sleep(1)
while True:
    ret = mon.handle_one_event()
mon.stop_watch(mydir)
del mon
person Foon    schedule 01.08.2013
comment
Ничего себе, момент пощечины на проблеме отступа! И я посмотрю на gamin, хотя сейчас я на Windows. - person Jamie Bull; 01.08.2013
comment
Я на 99% уверен, что через Windows API есть эквивалент Windows, хотя вам может понадобиться использовать IronPython. С другой стороны, я понял после публикации, что реальная польза для gamin и т. д. заключается в том, что вы получаете практически мгновенные обновления; если ваша главная задача состоит в том, чтобы просто не сжечь процессор, ваш шаблон опроса со сном имеет гораздо больше смысла, чтобы он был простым. (И мы все были там с пощечиной, хотя теоретически python должно быть легче обнаружить... Я до сих пор помню программу на C, где у меня было зависание else, которое выглядело хорошо с отступами, которые у меня были) - person Foon; 01.08.2013
comment
Проблема в том, что часть, которую я разместил, была действительно правильной. Это давало новым файлам возможность синхронизироваться в Dropbox. Real time.sleep() был ниже, и его было (совсем) не так легко обнаружить, но он все еще имел неправильный отступ. - person Jamie Bull; 01.08.2013

Существует также межплатформенный API для отслеживания изменений файловой системы: Watchdog.

person Rahul K    schedule 01.08.2013