J'ai posé cette question avant de tuer un processus qui utilise trop de mémoire, et j'ai plus de solution a fonctionné.
Cependant, il y a un problème: le calcul massivement semble être épargnée par la méthode que je suis en train d'utiliser. Ce code ci-dessous est destiné à mettre un 10 secondes de temps CPU limite sur le processus.
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)
Ce que j' attends de voir quand je lance ce script sur une machine Unix) est-ce:
-1 -1
ran out of time!
Au lieu de cela, je n'ai pas de sortie. La seule manière, je suis sortie avec Ctrl + C, et je reçois ce si je Ctrl + C au bout de 10 secondes:
^C-1 -1
ran out of time!
CPU time limit exceeded
Si je Ctrl + C avant 10 secondes, puis-je le faire deux fois, et la sortie de la console ressemble à ceci:
^C-1 -1
^CTraceback (most recent call last):
File "procLimitTest.py", line 18, in <module>
y = 10**(10**10)
KeyboardInterrupt
Dans le cadre de l'expérimentation et d'essayer de comprendre cela, j'ai aussi mis time.sleep(2)
entre le print et le grand nombre de calcul. Il ne semble pas avoir d'effet. Si je change y = 10**(10**10)
de y = 10**10
, puis l'imprimer et le sommeil états fonctionner comme prévu. L'ajout d' flush=True
pour l'instruction print ou sys.stdout.flush()
après l'instruction d'impression ne fonctionne pas non plus.
Pourquoi ne puis-je pas de limite de temps PROCESSEUR pour le calcul d'un très grand nombre? Comment puis-je réparer ou au moins atténuer ce risque?
Informations supplémentaires:
Une version de Python: 3.3.5 (default, Jul 22 2014, 18:16:02) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)]
Linux renseignements: 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