繁体   English   中英

如何可靠地知道单独线程中的 HTTPServer 已启动并提供服务?

[英]How to reliably know that HTTPServer in a separate thread is up and serving?

我在新线程中启动HTTPServer object:

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.start() 之后插入thread.join(timeout=1) thread.start()但这仍然存在竞争条件的风险。 有没有一种可靠的方法可以等到serve_forever启动并运行?

当然可以。 有一个名为service_actions的回调,它在serve_forever循环的每次迭代后调用,您可以在其中使用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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM