Я задал этот вопрос до того, как убить процесс, который использует слишком много памяти, и у меня есть большая часть разработанного решения.
Однако есть одна проблема: вычисление массивных чисел, кажется, не затронуто методом, который я пытаюсь использовать. Этот код, приведенный ниже, предназначен для установки 10-секундного времени процессора на процесс.
import resource
import os
import signal
def timeRanOut(n, stack):
raise SystemExit('ran out of time!')
signal.signal(signal.SIGXCPU, timeRanOut)
soft,hard = resource.getrlimit(resource.RLIMIT_CPU)
print(soft,hard)
resource.setrlimit(resource.RLIMIT_CPU, (10, 100))
y = 10**(10**10)
То, что я ожидаю увидеть при запуске этого script (на машине Unix), следующее:
-1 -1
ran out of time!
Вместо этого я не получаю никакого вывода. Единственный способ получить результат - это Ctrl + C, и я получаю это, если я Ctrl + C через 10 секунд:
^C-1 -1
ran out of time!
CPU time limit exceeded
Если я Ctrl + C до 10 секунд, то я должен сделать это дважды, а вывод консоли выглядит следующим образом:
^C-1 -1
^CTraceback (most recent call last):
File "procLimitTest.py", line 18, in <module>
y = 10**(10**10)
KeyboardInterrupt
В ходе экспериментов и попыток понять это, я также поставил time.sleep(2)
между расчетом печати и большого числа. Кажется, это не имеет никакого эффекта. Если я изменю y = 10**(10**10)
на y = 10**10
, то операторы печати и сна будут работать должным образом. Добавление flush=True
в оператор печати или sys.stdout.flush()
после того, как инструкция печати также не работает.
Почему я не могу ограничить время процессора для вычисления очень большого числа? Как я могу исправить или хотя бы смягчить это?
Дополнительная информация:
Версия Python: 3.3.5 (default, Jul 22 2014, 18:16:02) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)]
Информация о Linux: Linux web455.webfaction.com 2.6.32-431.29.2.el6.x86_64 #1 SMP Tue Sep 9 21:36:05 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux