首页 > 解决方案 > 如何可靠地知道单独线程中的 HTTPServer 已启动并正在服务?

问题描述

我正在HTTPServer一个新线程中启动一个对象:

from http.server import HTTPServer, SimpleHTTPRequestHandler
import threading

with HTTPServer(("localhost", 8080), SimpleHTTPRequestHandler) as httpd:
    thread = threading.Thread(target=httpd.serve_forever, daemon=True)
    thread.start()
    # Doing my work ...
    httpd.shutdown()

在这里,我要确保在到达httpd.serve_forever()之前已经成功启动# doing my work...。我当然可以在thread.join(timeout=1)之后插入thread.start(),但这仍然有竞争条件的风险。有没有可靠的方法等到serve_forever启动并运行?

标签: pythonmultithreadingsimplehttpserver

解决方案


肯定的事。每次循环迭代后都会调用一个回调service_actionsserve_forever,您可以在其中使用 a threading.Event(),您可以等待。

由于回调是在每个可能服务的请求之后调用的,因此会导致最多 0.5 秒的初始延迟(默认情况下),但我认为这不是问题。如果是,您可以serve_forever在第一次请求服务之前覆盖它。

import threading
from http.server import HTTPServer, SimpleHTTPRequestHandler


class SignalingHTTPServer(HTTPServer):

    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
        self.ready_event = threading.Event()

    def service_actions(self):
        self.ready_event.set()


with SignalingHTTPServer(("localhost", 8080), SimpleHTTPRequestHandler) as httpd:
    thread = threading.Thread(target=httpd.serve_forever, daemon=True)
    thread.start()
    httpd.ready_event.wait()
    # Doing my work ...
    httpd.shutdown()

推荐阅读