簡體   English   中英

如何從httprequest處理程序中停止python中的simplehttpserver?

[英]How to stop a simplehttpserver in python from httprequest handler?

我是python的新手,在python中編寫了一個簡單的httpserver。 我試圖關閉服務器從請求到服務器。 如何從處理程序中實現調用服務器功能的這一功能?

class MyHandler(SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/shutdown':
            pass # I want to call MainServer.shutdown from here


class MainServer()
    def __init__(self, port = 8123):
        self._server = HTTPServer(('0.0.0.0', port), MyHandler)
        self._thread = threading.Thread(target = self._server.serve_forever)
        self._thread.deamon = True 


    def start(self):
        self._thread.start()

    def shut_down(self):
        self._thread.close()

簡而言之,不要使用server.serve_forver(..) 請求處理程序具有self.server屬性,您可以使用該屬性與主服務器實例進行通信,以設置某種標志,告訴服務器何時停止。

import threading
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer

class MyHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/shutdown':
            self.server.running = False


class MainServer:
    def __init__(self, port = 8123):
        self._server = HTTPServer(('0.0.0.0', port), MyHandler)
        self._thread = threading.Thread(target=self.run)
        self._thread.deamon = True 

    def run(self):
        self._server.running = True
        while self._server.running:
            self._server.handle_request()

    def start(self):
        self._thread.start()

    def shut_down(self):
        self._thread.close()

m = MainServer()
m.start()

通常可以通過server屬性從處理程序訪問server 可以使用其... shutdown()方法關閉使用server_forerver啟動的HTTPServer。 不幸的是,即使沒有記錄,也無法從運行服務器循環的線程調用shutdown,因為它會導致死鎖。 所以你可以在你的do_GET處理程序方法中寫這個:

def do_GET(self):
    # send something to requester...
    if self.path == '/shutdown':
        t = threading.Thread(target = self.server.shutdown)
        t.daemon = True
        t.start()

這將干凈地讓線程終止,你也應該在服務器的shut_down方法中使用它,因為Python線程不能突然關閉:

def shut_down(self):
    self._server.shutdown()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM