我在一个单独的线程中运行我的HTTPServer
(使用线程模块,它无法停止线程……)并且想要在主线程也关闭时停止服务请求。
Python文档指出,BaseHTTPServer.HTTPServer
是SocketServer.TCPServer
的子类,后者支持shutdown
方法,但HTTPServer
中缺少它。
整个BaseHTTPServer
模块的文档非常少:(
发布于 2008-11-06 13:21:35
我应该先说“我可能不会自己做这件事,但我过去做过”。serve_forever (来自SocketServer.py)方法如下所示:
def serve_forever(self):
"""Handle one request at a time until doomsday."""
while 1:
self.handle_request()
您可以(在子类中)用while self.should_be_running
替换while 1
,然后在不同的线程中修改该值。类似于:
def stop_serving_forever(self):
"""Stop handling requests"""
self.should_be_running = 0
# Make a fake request to the server, to really force it to stop.
# Otherwise it will just stop on the next request.
# (Exercise for the reader.)
self.make_a_fake_request_to_myself()
编辑:我找出了我当时使用的实际代码:
class StoppableRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer):
stopped = False
allow_reuse_address = True
def __init__(self, *args, **kw):
SimpleXMLRPCServer.SimpleXMLRPCServer.__init__(self, *args, **kw)
self.register_function(lambda: 'OK', 'ping')
def serve_forever(self):
while not self.stopped:
self.handle_request()
def force_stop(self):
self.server_close()
self.stopped = True
self.create_dummy_request()
def create_dummy_request(self):
server = xmlrpclib.Server('http://%s:%s' % self.server_address)
server.ping()
发布于 2013-10-07 01:32:18
基于http://docs.python.org/2/library/basehttpserver.html#more-examples的另一种方法是:只要满足条件,就继续服务,而不是使用serve_forever(),服务器在每次请求之前和之后都会检查条件。例如:
import CGIHTTPServer
import BaseHTTPServer
KEEP_RUNNING = True
def keep_running():
return KEEP_RUNNING
class Handler(CGIHTTPServer.CGIHTTPRequestHandler):
cgi_directories = ["/cgi-bin"]
httpd = BaseHTTPServer.HTTPServer(("", 8000), Handler)
while keep_running():
httpd.handle_request()
发布于 2008-11-06 13:30:25
在我的Python2.6安装中,我可以在底层TCPServer上调用它-它仍然在您的HTTPServer
中
TCPServer.shutdown
>>> import BaseHTTPServer
>>> h=BaseHTTPServer.HTTPServer(('',5555), BaseHTTPServer.BaseHTTPRequestHandler)
>>> h.shutdown
<bound method HTTPServer.shutdown of <BaseHTTPServer.HTTPServer instance at 0x0100D800>>
>>>
https://stackoverflow.com/questions/268629
复制相似问题