Parametr preexec_fn służy do podprocesu.Popen i modułu zasobów. Przykład:
parent.py:
#!/usr/bin/env python
import os
import sys
import resource
import subprocess
def setlimits():
# Set maximum CPU time to 1 second in child process, after fork() but before exec()
print "Setting resource limit in child (pid %d)" % os.getpid()
resource.setrlimit(resource.RLIMIT_CPU, (1, 1))
print "CPU limit of parent (pid %d)" % os.getpid(), resource.getrlimit(resource.RLIMIT_CPU)
p = subprocess.Popen(["./child.py"], preexec_fn=setlimits)
print "CPU limit of parent (pid %d) after startup of child" % os.getpid(), resource.getrlimit(resource.RLIMIT_CPU)
p.wait()
print "CPU limit of parent (pid %d) after child finished executing" % os.getpid(), resource.getrlimit(resource.RLIMIT_CPU)
child.py:
#!/usr/bin/env python
import os
import sys
import resource
print "CPU limit of child (pid %d)" % os.getpid(), resource.getrlimit(resource.RLIMIT_CPU)
parent.py się talerza w nowym procesie. W nowym procesie wywoła on setlimits(), a następnie exec child.py. Oznacza to, że zasoby będą ograniczone w procesie potomnym, ale nie w elemencie nadrzędnym.
wyjścia programu podczas uruchamiania:
./parent.py
CPU limit of parent (pid 17404) (-1, -1)
Setting resource limit in child (pid 17405)
CPU limit of parent (pid 17404) after startup of child (-1, -1)
CPU limit of child (pid 17405) (1, 1)
CPU limit of parent (pid 17404) after child finished executing (-1, -1)
Jest to w wielu przypadkach lepszym rozwiązaniem niż próby użycia ulimit, ponieważ nie zawsze jest dobrym pomysłem na tarło podproces poprzez powłoki, zwłaszcza, że często powoduje brzydki parametr cytując kłopoty.
Być może zechcesz zaakceptować odpowiedź z najwyższym wynikiem głosowania zamiast odpowiedzi. Jest znacznie lepszy niż mój. –