Полностью переписан на основе моего собственного исследованияНагрузочный подпроцесс в Python
У меня есть мастер-скрипт, который запускает ряд других сценариев Python. Сценарии создаются как
from subprocess import STDOUT, Popen
from signal import SIGINT
import shlex
p = Popen(shlex.split("python somescript.py arg1 arg2"), cwd="../src/somedir", stderr=STDOUT)
И оканчиваются
p.send_signal(SIGINT)
p.wait()
Внутри них есть следующий код
if __name__ == "__main__":
import signal
def terminate(*args):
raise KeyboardInterrupt
signal.signal(signal.SIGINT, terminate)
# do some work here
Каждый сценарий имеет некоторые функции, имеющие
try:
# create workers
except KeyboardInterrupt:
# cleanup, wait for the current worker to end, then return
Все описанные работы как предполагается - мастер-скрипт создает процессы, когда он заканчивается, он отправляет им SIGINT, они обрабатывают его корректно, изящно выходя.
Теперь я хочу запустить сервер Django dev таким же образом.
Я изменил manage.py
файл:
if __name__ == "__main__":
import signal
def terminate(*args):
print 'got SIGINT'
raise KeyboardInterrupt
signal.signal(signal.SIGINT, terminate)
execute_manager(settings)
В execute_manager
функции после того, как количество вызовов, приводит к способу команды Джанго, имеющему except KeyboardInterrupt
блока с sys.exit(0)
. Таким образом, вся установка выглядит одинаково.
Проблема: сервер django на самом деле не остановлен, хотя я вижу вывод got SIGINT
.
Возможно объяснение:
Похоже, сама Джанго manage.py вилок, или делает что-то подобное; глядя в Activity Monitor (проводник процессов osx). Я вижу, что запущено 3 процесса python - одно для мастер-скрипта и, возможно, 2 для manage.py. Когда заканчивается, 2 из них останавливаются (мастер-скрипт и тот, с которым у меня есть ссылка с p
), в то время как третий продолжает блокировать порт 8000. Есть ли способ получить подпроцессы процесса?
Почему вы не используете 'p.kill()'? –
, потому что подпроцессы имеют определенную структуру, каждая из которых имеет свой обработчик для KeyboardInterrupt и делает выход __gracefull__ (например, ожидающий завершения рабочих заданий) – Guard
Какая ОС вы используете? – mjhm