пятница, 21 ноября 2014 г.

Отслеживаем завершение процессом загрузки CPU (для задач pywinauto)

pywinauto - это Python модуль для автоматизации процессов над графическим интерфейсом Microsoft Windows. Другими словамия, модуль позволяет эмулировать действия мыши и клавиатуры над объектами окна.

Порой случается такая ситуация что приложение выполняет какое либо трудоемкое задание, при этом не выдает никаких "внешних" признаков по которым можно было бы отследить средствами pywinauto факт завершения выполнения задачи. Использование простой задержки time.sleep() черевато проблемами, если таймаут наступит, а процесс все еще будет занят.
Все что мы знаем в такой ситуации это то что процесс потребляет ресурсы CPU, так почему бы этим не воспользоваться?

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

Для того что бы узнать текущую нагрузку CPU приложением воспользуемся библиотекой psutil. Привиденный ниже код следит за уровнем загрузки процессора приложением и если он в течении time_sec секунд находится ниже отметки threshold то считается что приложение выполнило свою трудоемкую задачу и теперь можно выполнять код дальше. В случае если программа явно ушла в бесконечный цикл и не освободает ресуры ЦПУ, то через заданный промежуток времени timeout функция вернет значение False.

import time
import psutil

def WaitUntilCPULoadRelease(process_id, time_sec=3, threshold=2.5, timeout=300):
         psutil_process=psutil.Process(process_id)
         start_time=time.time()
         mark_time=None

         while True:
             if psutil_process.cpu_percent()<threshold:
                 mark_time=mark_time or time.time()
                 if (time.time()-mark_time)>=time_sec:
                     return True
             else:
                 mark_time=None
             
             if (time.time()-start_time)>=timeout:
                     return False
             time.sleep(0.1)

2 комментария:

  1. Эта функция вообще будет работать?

    Сначала вы его делаете bool-значением этой строчкой
    >>mark_time=mark_time or time.time()

    А потом это же значение вычитаете из числа:
    >>time.time()-mark_time

    может что-то непонимаю, но кажется Вы где-то очепятолись

    ОтветитьУдалить
  2. Вы что то не понимаете. А именно что делает логический оператор or. Читайте в книге Лутца например
    Функция рабочая

    ОтветитьУдалить