Python SimpleHTTPServer зависает после нескольких запросов

Я пишу простой интеграционный тест, который состоит из следующего:

  1. Запуск простого HTTP-сервера, который обслуживает тестируемую страницу
  2. Запуск различных браузеров, которые загружают эту страницу, чтобы подтвердить, что все работает.

I know #2 works and I have no problem with this.

Однако #1 работает только для первых нескольких браузеров, а затем просто зависает, что приводит к сбою последующих тестов браузера. Я действительно не понимаю, почему.

В моем коде вот что я делаю:

class Test:  
    def setup_class(cls):  
        ready_signal = threading.Event()  
        cls.port = 9000  
        cls.docroot = /tmp  
        cls.http_wrapper = SimpleHTTPWrap(port=cls.port, docroot=cls.docroot, ready_signal)  
        background_thread = threading.Thread(target=http_wrapper.start)  
        background_thread.daemon = True  
        background_thread.start()  
        ready_signal.wait(10) # Wait for thread to be ready (or proceed after timeout)  
    def test(self):  
        ip = get_my_ip_address()  
        self.browser = webdriver.Remote(_some_parameters_go_here)  
        self.browser.get('http://' + ip + ":" + cls.port + cls.docroot + '/test.html')  
        # This hangs after similar tests have already run and succeeded  
    def teardown_class(cls):  
        cls.http_wrapper.stop()    

class SimpleHTTPWrap(object):  
    def __init__(self, port, docroot, ready_signal):  
        self.port = port  
        self.docroot = docroot  
        self.request_handler = SimpleHTTPServer.SimpleHTTPRequestHandler  
        self.server = None  
        self.ready_signal = ready_signal  
    def start(self):  
        os.chdir(self.docroot)  
        try:  
            log.info("Attempting to bind to port: " + str(self.port))  
            self.server = SocketServer.TCPServer(("", self.port), self.request_handler)  
            self.server.allow_reuse_address = True  
            log.info("Success.")  
            self.ready_signal.set() # Signal the main thread that we're ready  
            self.server.serve_forever()  
        except socket.error:  
            log.error("Could not bind to address (port already in use)" + str(self.port))  

Я думаю, что это какая-то тупиковая ситуация, потому что когда я пытался вызвать cls.http_wrapper.server.shutdown(), он просто зависал.

Тем не менее, я понятия не имею, почему. Здесь есть только один поток, работающий здесь в фоновом режиме, и другие тесты кажутся хорошими. Но через несколько все зависает.
С точки зрения браузера, он пытается загрузить страницу некоторое время, пока не истечет время ожидания из-за отказа в соединении.

Кто-нибудь случайно узнает, что может быть причиной этого или что я могу сделать для дальнейшего расследования? На данный момент я в растерянности и думаю просто попробовать что-то еще.

1 ответ

Это происходит со мной, когда я получаю внешнее соединение, а на сервере есть браузер с открытой страницей. Когда я закрываю страницу, внешние клиенты могут без проблем подключаться.

У меня довольно простой HTTP-сервер, но я обрабатываю обслуживание с помощью

      with http.server.HTTPServer(("0.0.0.0", PORT), myHandler) as server:
   print("Running on port", PORT)
   server.serve_forever()

Я знаю, что вопрос старый, но я надеюсь, что это может помочь кому-то.

Другие вопросы по тегам