У меня есть питон-сервер из HTTPServer
. И я хочу использовать этот сервер как службу Windows:
Так выглядит сервер:
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.wfile.write(bytes("Hi, guys.", "utf8"))
class Server:
def __init__(self, host, port):
self.http_server = HTTPServer((host, port), Handler)
self.thread = threading.Thread(target=self.http_server.serve_forever)
def start(self):
self.thread.start()
def stop(self):
self.http_server.shutdown()
self.thread.join()
@staticmethod
def do_job():
do_some_staff_here()
time.sleep(1)
Итак, все очень просто. Для создания службы Windows я использую pywin32. Посмотрим на мой код:
class AppServerSvc(win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "TestService"
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
self.stop_requested = False
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
self.stop_requested = True
def SvcDoRun(self):
servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
servicemanager.PYS_SERVICE_STARTED,
(self._svc_name_, ''))
self.main()
def main(self):
server = Server("", 8080)
server.start()
while not self.stop_requested:
server.do_job()
server.stop()
if __name__ == '__main__':
win32serviceutil.HandleCommandLine(AppServerSvc)
И есть некоторые проблемы:
self.send_response(200)
, сервис начинает нормально работать в обоих режимах.В чем же причина такого поведения?
ОБНОВИТЬ
Я получаю следующую ошибку, когда пытаюсь выполнить send_response()
:
'NoneType' object has no attribute 'write'
: D Мне просто нужен какой-то демон света на машине с Windows, так что, может быть, это новая тенденция
почему бы не использовать одно из 100000000 миллионов лучших решений (например, apache или gunicorn), которые действительно предназначены для этого? Я подозреваю, что любая форма HTTPServer.start()
в конечном итоге зависнет и перестанет отвечать, что потребует перезапуска службы чаще, чем вам хотелось бы (да, даже если вы просто работаете локально) (я знаю, что это на самом деле не решает ваш вопрос ...)
Насколько я знаю (могу ошибаться), apache не может одновременно запускать сервер и бесконечный цикл.
нет бесконечного цикла, если вы используете apache (или gunicorn) ... вы бы остановили службу, остановив apache или gunicorn
Я не уверен, что понимаю, что ты имеешь в виду. Что я хочу иметь: сервер, который принимает почтовые запросы, и один раз в день мне нужно отправлять электронное письмо. Это все.
У меня была такая же ошибка при написании плагина для QGIS в python 3.7.
После некоторого покопания выяснилось, что send_response()
внутренне вызывает sys.stderr.write
(в log_message), а stderr
здесь равен нулю. Как я не рассказываю, t know much about QGIS and python and plugins and all I can
t почему это s like that. I solved this by simply overriding
log_message` в моем плагине.
я почти уверен, что http.HTTPServer не предназначен для использования в качестве производственного сервера ... Недавно я видел несколько подобных вопросов, что заставляет меня немного нервничать