Мониторинг и завершение скрипта Python на основе использования системных ресурсов - PullRequest
1 голос
/ 04 апреля 2010

Каков «правильный» или «лучший» способ отслеживания системных ресурсов, которые использует скрипт python, и его прекращение, если использование ресурса превышает некоторые заранее определенные значения.В моем случае использование памяти вызывает беспокойство.Я не спрашиваю, как измерить использование системных ресурсов, хотя я открыт для предложений.

В качестве простого примера, давайте предположим, что у меня есть функция, которая находит простые числа, меньшие некоторого большого числа, и добавляет их в список.на основании какого-то условия.Я не знаю заранее, сколько простых чисел будет удовлетворять условию, поэтому я должен быть уверен, что завершить функцию, если я использую много системной памяти (скажем, 8 ГБ).Я знаю, что есть способы контролировать размер объектов Python.Чего я не знаю, так это того, что правильный способ контролировать размер списка и выхода состоит в том, чтобы просто включить проверку размера в основной цикл функции и выйти, если он превышает 8 ГБ или если есть «внешний» (под внешним я имею в видувнешний по отношению к циклу, но все еще внутри скрипта Python или его части) способ мониторинга и выхода.

В моем случае я работаю на Mac, но задаю вопрос в целом.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2010

resource.getrusage() (в частности ru_idrss) может дать вам использование ресурсов текущего интерпретатора python, который вы можете использовать в качестве дозорного для остановки обработки.

2 голосов
/ 04 апреля 2010

В Unix-подобной системе полезным «внешним» способом мониторинга любого процесса является команда ulimit (вы не уточняете, хотите ли вы вместо этого запускаться в Windows, где ulimit не работает) Существует и другие подходы, но я их не знаю; -).

Если вы думаете о выполнении таких элементов управления в своих собственных программах на Python, просто измените соответствующую функцию, чтобы проверить размер каждого объекта, добавляемого в список (и сохранить промежуточный итог) и вернуться, когда промежуточный итог достигнет или превышает пороговое значение (которое можно передать в качестве дополнительного параметра рассматриваемой функции).

Редактировать : ФП пояснил в комментарии, что они хотят, чтобы мониторинг проводился в самом худшем месте, которое он мог бы разместить - в предыдущих параграфах я упоминал, как легко это сделать вне процесса, легко внутри функции, но ОП хочет, чтобы она «попала в середину» ;-).

Наименее плохой путь, вероятно, с "сторожевым потоком" - отдельным потоком демона в бесконечном цикле, который каждые X секунды проверяет потребление ресурсов процесса (например, с помощью resource.getrusage, если на Unix-подобных машинах - опять же, если в Windows нужно что-то еще), и, если это потребление превышает желаемые пределы, пытается уничтожить основной поток с помощью thread.interrupt_main . Конечно, это не всегда надежно: периодичность X (как и во всех случаях «опроса») должна быть достаточно низкой, чтобы тем временем остановить процесс разгона, но достаточно высокой, чтобы не замедлять процесс до сканирования. Кроме того, основной поток (единственный, который может быть прерван подобным образом) может блокировать исключения (в этом случае сторожевой поток может попытаться с помощью «сигналов этому самому процессу» возрастающей серьезности вплоть до SIGKILL). сигнал убийцы, который никогда не может быть заблокирован или перехвачен).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...