Вы должны думать об указателях как об адресах виртуальной памяти: современные потребительские операционные системы и среды выполнения помещают как минимум один уровень абстракции между физической памятью и тем, что вы видите как значение указателя.
Что касается вашего последнего утверждения, вы не можете сделать это предположение, даже в адресном пространстве виртуальной памяти. Арифметика указателей действительна только внутри блоков непрерывной памяти, таких как массивы. И хотя допустимо (как в C, так и в C ++) назначить указатель на одну точку после массива (или скаляра), поведение на , определяющее такой указатель, не определено. Гипотезы о смежности в физической памяти в контексте C и C ++ не имеют смысла.
После небольшого поиска в 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()
Что по большей части приходит после того, как я форкнул и закончил до решения моей проблемы.
Вы начинаете с создания экземпляра HTTPServer. Но на самом деле вы не говорите ему начать обслуживание в любом из предоставленных кодов. В дочернем процессе попробуйте вызвать server.serve_forever ()
.
См. для справки
Просто используйте daemontools или другой аналогичный сценарий вместо того, чтобы запускать собственный процесс демонизации. Гораздо лучше не включать это в свой сценарий.
Кроме того, лучший вариант: не использовать BaseHTTPServer. Это действительно плохо. Есть много хороших HTTP-серверов для python, например cherrypy или paste . Оба содержат готовые к использованию сценарии демонизации.
Вот как это сделать с помощью библиотеки 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 и т. Д. Но это все выходит за рамки вопроса.
Поскольку с момента моего первоначального сообщения на этот вопрос уже были получены ответы, я решил поделиться небольшой информацией.
Проблема с выводом связана с тем, что обработчик по умолчанию для модуля протоколирования использует 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-серверов.