Python Daemonizing BaseHTTPServer

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

Что касается вашего последнего утверждения, вы не можете сделать это предположение, даже в адресном пространстве виртуальной памяти. Арифметика указателей действительна только внутри блоков непрерывной памяти, таких как массивы. И хотя допустимо (как в C, так и в C ++) назначить указатель на одну точку после массива (или скаляра), поведение на , определяющее такой указатель, не определено. Гипотезы о смежности в физической памяти в контексте C и C ++ не имеют смысла.

10
задан Gavin M. Roy 20 May 2009 в 17:22
поделиться

5 ответов

После небольшого поиска в Google я наконец наткнулся на эту документацию BaseHTTPServer , и после этого я получил:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from SocketServer import ThreadingMixIn

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
  """Handle requests in a separate thread."""

server = ThreadedHTTPServer((config['HTTPServer']['listen'],config['HTTPServer']['port']), HTTPHandler)
server.serve_forever()

Что по большей части приходит после того, как я форкнул и закончил до решения моей проблемы.

7
ответ дан 3 December 2019 в 23:51
поделиться

Вы начинаете с создания экземпляра HTTPServer. Но на самом деле вы не говорите ему начать обслуживание в любом из предоставленных кодов. В дочернем процессе попробуйте вызвать server.serve_forever () .

См. для справки

2
ответ дан 3 December 2019 в 23:51
поделиться

Просто используйте daemontools или другой аналогичный сценарий вместо того, чтобы запускать собственный процесс демонизации. Гораздо лучше не включать это в свой сценарий.

Кроме того, лучший вариант: не использовать BaseHTTPServer. Это действительно плохо. Есть много хороших HTTP-серверов для python, например cherrypy или paste . Оба содержат готовые к использованию сценарии демонизации.

0
ответ дан 3 December 2019 в 23:51
поделиться

Вот как это сделать с помощью библиотеки python-daemon :

from BaseHTTPServer import (HTTPServer, BaseHTTPRequestHandler)
import contextlib

import daemon

from my_app_config import config

# Make the HTTP Server instance.
server = HTTPServer(
    (config['HTTPServer']['listen'], config['HTTPServer']['port']),
    BaseHTTPRequestHandler)

# Make the context manager for becoming a daemon process.
daemon_context = daemon.DaemonContext()
daemon_context.files_preserve = [server.fileno()]

# Become a daemon process.
with daemon_context:
    server.serve_forever()

Как обычно для демона, вам нужно решить, как вы будете взаимодействовать с программой после того, как она станет демоном. Например, вы можете зарегистрировать службу systemd или написать файл PID и т. Д. Но это все выходит за рамки вопроса.

3
ответ дан 3 December 2019 в 23:51
поделиться

Поскольку с момента моего первоначального сообщения на этот вопрос уже были получены ответы, я решил поделиться небольшой информацией.

Проблема с выводом связана с тем, что обработчик по умолчанию для модуля протоколирования использует StreamHandler. Лучший способ справиться с этим - создать свои собственные обработчики. В случае, если вы хотите использовать модуль протоколирования по умолчанию, вы можете сделать что-то вроде этого:

# Get the default logger
default_logger = logging.getLogger('')

# Add the handler
default_logger.addHandler(myotherhandler)

# Remove the default stream handler
for handler in default_logger.handlers:
    if isinstance(handler, logging.StreamHandler):
        default_logger.removeHandler(handler)

Также на данный момент я перешел к использованию очень хорошего проекта Tornado для моих встроенных http-серверов.

0
ответ дан 3 December 2019 в 23:51
поделиться
Другие вопросы по тегам:

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