Python: ulimit и хороший для subprocess.call / подпроцесс. Popen?

Можно использовать whois сервис. На UNIX как операционная система Вы выполнили бы следующую команду. Кроме того, можно сделать это в сети в http://www.internic.net/whois.html .

whois stackoverflow.com

Вы получили бы следующий ответ.

... текст, удаленный здесь...

Доменные серверы в перечисленном порядке: NS51.DOMAINCONTROL.COM NS52.DOMAINCONTROL.COM

можно использовать nslookup или вырыть для обнаружения большей информации о записях для данного домена. Это могло бы помочь Вам разрешить конфликты, которые Вы описали.

39
задан Mike Graham 28 June 2011 в 18:37
поделиться

2 ответа

Вы можете установить ограничения для подпроцессов с помощью команд оболочки ulimit и nice следующим образом:

import subprocess
subprocess.Popen('ulimit -t 60; nice -n 15 cpuhog', shell=True)

Это запускает cpuhog с ограничением процессорного времени в 60 секунд и настройкой на удобство 15. Обратите внимание, что нет простого способа установить 20% дроссель процессора как таковой. Процесс будет использовать 100% ЦП, если другой (менее приятный) процесс также не потребует ЦП.

11
ответ дан 27 November 2019 в 02:06
поделиться

Используйте параметр preexec_fn для subprocess.Popen и модуля ресурсов. Пример:

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 будет разветвляться на новый процесс. В новом процессе он вызовет setlimits (), затем exec child.py . Это означает, что ресурс будет ограничен в дочернем процессе, но не в родительском.

Вывод при запуске программы:

./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)

Во многих случаях это лучшее решение, чем попытка использовать ulimit, поскольку это не всегда хорошая идея для создания подпроцесса через оболочку, тем более что это часто вызывает неприятные проблемы с цитированием параметров.

105
ответ дан 27 November 2019 в 02:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: