Ich habe gefragt, this question vor über das Töten eines Prozesses, der zu viel Speicher verwendet, und ich habe die meisten einer Lösung ausgearbeitet.Warum hängt Python "präemptiv" beim Versuch, eine sehr große Zahl zu berechnen?
Es gibt jedoch ein Problem: Die Berechnung massiver Zahlen scheint von der Methode, die ich verwenden möchte, nicht betroffen zu sein. Dieser Code soll ein 10-Sekunden-CPU-Zeitlimit für den Prozess festlegen.
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)
Was erwarte ich zu sehen, wenn ich dieses Skript ausführen (auf einer Unix-Maschine), ist dies:
-1 -1
ran out of time!
Stattdessen habe ich keine Ausgabe erhalten. Der einzige Weg, ich Ausgang bekommen, ist mit Ctrl + C, und ich dies, wenn ich Ctrl + C nach 10 Sekunden:
^C-1 -1
ran out of time!
CPU time limit exceeded
Wenn ich Ctrl + Cvor 10 Sekunden, dann muss ich es zweimal tun, und die Konsolenausgabe sieht so aus:
^C-1 -1
^CTraceback (most recent call last):
File "procLimitTest.py", line 18, in <module>
y = 10**(10**10)
KeyboardInterrupt
Im Laufe des Experimentierens und versuchen, dies herauszufinden, habe ich auch time.sleep(2)
zwischen der Druck-und große Zahl Berechnung gesetzt. Es scheint keine Wirkung zu haben. Wenn ich y = 10**(10**10)
zu y = 10**10
ändere, funktionieren die Print- und die Sleep-Anweisung wie erwartet. Das Hinzufügen von flush=True
zu der print-Anweisung oder sys.stdout.flush()
nach der print-Anweisung funktioniert auch nicht.
Warum kann ich die CPU-Zeit für die Berechnung einer sehr großen Zahl nicht begrenzen? Wie kann ich das beheben oder zumindest mildern?
Zusätzliche Informationen:
Python-Version: 3.3.5 (default, Jul 22 2014, 18:16:02) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)]
Linux Informationen: 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
Ich kann auf 3.4.3 aber nicht 2.7.9 reproduzieren. Das ist gruselig. – senshin
Hmm ... Ich bekomme immer 'SystemError: PyEval_EvalFrameEx hat ein Ergebnis mit einer Fehlermenge zurückgegeben 'was auch immer vor oder nach 10 Sekunden auf meinem' Arch Linux 4.2.5-1-ARCH' mit Python 3.5. Und wenn ich Python 2.7 benutze den Code, funktioniert es gut als Ihre erwartete Ausgabe. –
Ich rate *, dass Python versucht, durch die Berechnung von Konstanten im voraus zu optimieren ... was zu Fehlzündungen führt. Aber ich habe keinen Beweis dafür. –