【发布时间】:2018-10-24 23:04:02
【问题描述】:
我有一个由HTTPServer 制成的python 服务器。我想将此服务器用作 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' 对象没有属性'write'
【问题讨论】:
-
我很确定 http.HTTPServer 不是设计成生产服务器的...最近看到几个这样的问题,让我有点紧张
-
:我只是需要在 Windows 机器上安装某种轻量级守护程序,所以也许这是一个新趋势
-
为什么不使用实际为此设计的 10 亿个更好的解决方案(即 apache 或 gunicorn)之一?我怀疑任何形式的
HTTPServer.start()最终都会挂起并变得无响应,需要比您想要的更频繁地重新启动服务(是的,即使您只是在本地运行)(我知道这实际上并不能解决您的问题......)跨度> -
据我所知(我可能是错的),apache 不能同时运行服务器和无限循环。
-
如果您使用 apache(或 gunicorn),则不会出现无限循环……您可以通过停止 apache 或 gunicorn 来停止服务
标签: python python-3.x windows-services pywin32