Вопрос

Мне нужно запустить серверный скрипт типа Python "навсегда" (или как можно дольше без потери состояния), чтобы они могли сохранять розетки открыты и асинхронно реагировать на события, подобные полученным данным.Например, если я использую Скрученный для связи с сокетом.

  • Как бы я справился с чем-то подобным?
  • Я в замешательстве?или есть лучшие способы реализовать асинхронную связь с сокетами?
  • После запуска скрипта один раз через сервер Apache, как мне остановить его запуск?
Это было полезно?

Решение

Если вы используете twisted, то у него есть целая инфраструктура для запуска и остановки демонов.

http://twistedmatrix.com/projects/core/documentation/howto/application.html

Как бы я справился с чем-то подобным?

Twisted хорошо подходит для этого, прочитайте ссылку выше

Я в замешательстве?или есть лучшие способы реализовать асинхронную связь с сокетами?

Twisted очень хорош в асинхронной связи с сокетами.Однако это тяжело воздействует на мозг, пока вы не освоитесь с этим!

После запуска скрипта один раз через сервер Apache, как мне остановить его запуск?

Инструменты twisted предполагают доступ к командной строке, поэтому вам придется написать cgi-оболочку для их запуска / остановки, если я понимаю, что вы хотите сделать.

Другие советы

Вы можете просто написать скрипт, который постоянно находится в блоке while, ожидая установления соединения, и ожидает сигнала для его закрытия.

http://docs.python.org/library/signal.html

Затем, чтобы остановить это, вам просто нужно запустить другой скрипт, который посылает ему этот сигнал.

Вы можете использовать ‘двойную развилку’ для запуска вашего кода в новом фоновом процессе, не привязанном к старому.Смотрите , например это рецепт с большим количеством поясняющих комментариев, чем вы могли бы пожелать.

Я бы не рекомендовал это в качестве основного способа запуска фоновых задач для веб-сайта.Например, если ваш Python встроен в процесс Apache, вы будете разветвлять больше, чем хотите.Лучше вызвать демона отдельно (только от имени аналогичного пользователя с низкими привилегиями).

После запуска скрипта один раз через сервер Apache, как мне остановить его запуск?

Ваш второй форк записывает номер процесса (pid) процесса-демона в файл, а затем считывает pid из этого файла и отправляет ему сигнал завершения (os.kill(pid, signal.SIG_TERM)).

Я в замешательстве?

Вот в чем вопрос!Я предполагаю, что вы пытаетесь запустить фоновый процесс, который реагирует на другой порт веб-интерфейса для какой-то необычной сетевой службы.Если вы просто говорите об ответе на обычные веб-запросы, вы не должны этого делать, вы должны полагаться на Apache для обработки ваших сокетов и обслуживания одного запроса за раз.

Я думаю, что Комета это то, что вы ищете.Обязательно взгляните и на Торнадо.

Возможно, вы захотите взглянуть на FastCGI, это звучит в точности так, как вы ищете, но я не уверен, находится ли это в стадии текущей разработки.Он использует демон CGI и специальный модуль apache для связи с ним.Поскольку демон работает долго, у вас нет затрат на форк / exec.Но как стоимость управления вашими собственными ресурсами (без автоматической очистки по каждому запросу)

Одна из причин, по которой этот стиль FastCGI больше не используется, заключается в том, что существуют способы встраивать интерпретаторы в двоичный файл Apache и запускать их на сервере.Я не знаком с mod_python, но я знаю, что mod_perl имеет конфигурацию, позволяющую запускать длительные процессы.Будьте осторожны здесь, так как длительный процесс на сервере может привести к утечке ресурсов.

Общий вопрос заключается в следующем:что ты хочешь сделать?Зачем вам нужен этот второй процесс, но все же каким-то образом управляемый apache?Почему вы не можете просто создать демон, который взаимодействует с apache, почему он должен управляться apache?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top