python - 如何可靠地知道单独线程中的 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
启动并运行?
解决方案
肯定的事。每次循环迭代后都会调用一个回调service_actions
serve_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()
推荐阅读
- java - 使用 UDP 传输协议减少 Android 的 WiFi 直接通信中的抖动
- graphql - Prisma 数据建模有很多和属于
- hyperledger - 区块链问题
- node.js - Node.js 服务器不会启动,但似乎连接到 DB
- docker - Jenkins 作业构建错误 | 尝试构建 docker 镜像 | Jenkins 和 Docker 都安装在 Windows 7 中
- ruby-on-rails - 如何使用 ajax 重新加载我的部分评论?
- spring - 我插入一个空列,然后在接下来保存数据
- python - 如何找出函数(的源代码)是否包含对特定模块的方法的调用?
- uwp - Devops:错误 CS0234:命名空间“Windows”中不存在类型或命名空间名称“ApplicationModel”
- node.js - WebSocket 握手期间出错:缺少“连接”标头