В Unix-подобной системе полезным «внешним» способом мониторинга любого процесса является команда ulimit (вы не уточняете, хотите ли вы вместо этого запускаться в Windows, где ulimit
не работает) Существует и другие подходы, но я их не знаю; -).
Если вы думаете о выполнении таких элементов управления в своих собственных программах на Python, просто измените соответствующую функцию, чтобы проверить размер каждого объекта, добавляемого в список (и сохранить промежуточный итог) и вернуться, когда промежуточный итог достигнет или превышает пороговое значение (которое можно передать в качестве дополнительного параметра рассматриваемой функции).
Редактировать : ФП пояснил в комментарии, что они хотят, чтобы мониторинг проводился в самом худшем месте, которое он мог бы разместить - в предыдущих параграфах я упоминал, как легко это сделать вне процесса, легко внутри функции, но ОП хочет, чтобы она «попала в середину» ;-).
Наименее плохой путь, вероятно, с "сторожевым потоком" - отдельным потоком демона в бесконечном цикле, который каждые X
секунды проверяет потребление ресурсов процесса (например, с помощью resource.getrusage, если на Unix-подобных машинах - опять же, если в Windows нужно что-то еще), и, если это потребление превышает желаемые пределы, пытается уничтожить основной поток с помощью thread.interrupt_main . Конечно, это не всегда надежно: периодичность X
(как и во всех случаях «опроса») должна быть достаточно низкой, чтобы тем временем остановить процесс разгона, но достаточно высокой, чтобы не замедлять процесс до сканирования. Кроме того, основной поток (единственный, который может быть прерван подобным образом) может блокировать исключения (в этом случае сторожевой поток может попытаться с помощью «сигналов этому самому процессу» возрастающей серьезности вплоть до SIGKILL
). сигнал убийцы, который никогда не может быть заблокирован или перехвачен).
Таким образом, этот промежуточный подход намного сложнее, чем команда ulimit
, он более хрупок и не имеет существенной добавленной стоимости. Но если вы хотите поместить мониторинг «внутри процесса, но вне функции, потребляющей ресурсы», без преимуществ, большого количества работы и других упомянутых мною недостатков, то это способ сделать это.