首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在BaseHTTPRequestHandler子类中停止BaseHTTPServer.serve_forever()?

如何在BaseHTTPRequestHandler子类中停止BaseHTTPServer.serve_forever()?
EN

Stack Overflow用户
提问于 2008-11-06 13:10:54
回答 9查看 85.2K关注 0票数 57

我在一个单独的线程中运行我的HTTPServer (使用线程模块,它无法停止线程……)并且想要在主线程也关闭时停止服务请求。

Python文档指出,BaseHTTPServer.HTTPServerSocketServer.TCPServer的子类,后者支持shutdown方法,但HTTPServer中缺少它。

整个BaseHTTPServer模块的文档非常少:(

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2008-11-06 13:21:35

我应该先说“我可能不会自己做这件事,但我过去做过”。serve_forever (来自SocketServer.py)方法如下所示:

代码语言:javascript
复制
def serve_forever(self):
    """Handle one request at a time until doomsday."""
    while 1:
        self.handle_request()

您可以(在子类中)用while self.should_be_running替换while 1,然后在不同的线程中修改该值。类似于:

代码语言:javascript
复制
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()

编辑:我找出了我当时使用的实际代码:

代码语言:javascript
复制
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()
票数 29
EN

Stack Overflow用户

发布于 2013-10-07 01:32:18

基于http://docs.python.org/2/library/basehttpserver.html#more-examples的另一种方法是:只要满足条件,就继续服务,而不是使用serve_forever(),服务器在每次请求之前和之后都会检查条件。例如:

代码语言:javascript
复制
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()
票数 28
EN

Stack Overflow用户

发布于 2008-11-06 13:30:25

在我的Python2.6安装中,我可以在底层TCPServer上调用它-它仍然在您的HTTPServer

代码语言:javascript
复制
TCPServer.shutdown


>>> import BaseHTTPServer
>>> h=BaseHTTPServer.HTTPServer(('',5555), BaseHTTPServer.BaseHTTPRequestHandler)
>>> h.shutdown
<bound method HTTPServer.shutdown of <BaseHTTPServer.HTTPServer instance at 0x0100D800>>
>>> 
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/268629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档