Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 15 additions & 4 deletions src/wavespeed/serverless/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ def _parse_args() -> argparse.Namespace:
"--waverless_api_host",
"--rp_api_host",
type=str,
default="localhost",
help="API server host (default: localhost)",
default="0.0.0.0",
help="API server host (default: 0.0.0.0)",
)
parser.add_argument(
"--waverless_api_port",
Expand Down Expand Up @@ -160,6 +160,17 @@ def handler(job):
port=args.waverless_api_port,
)
else:
# Standard worker mode
# Standard worker mode with health check server
log.info("Starting serverless worker...")
run_worker(config)
from .modules.health import HealthServer

health_server = HealthServer(
host=args.waverless_api_host,
port=args.waverless_api_port,
)
health_server.start()

try:
run_worker(config)
finally:
health_server.stop()
59 changes: 59 additions & 0 deletions src/wavespeed/serverless/modules/health.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"""Lightweight health check HTTP server for worker mode."""

import threading
from http.server import BaseHTTPRequestHandler, HTTPServer
from typing import Optional

from .logger import log


class HealthHandler(BaseHTTPRequestHandler):
"""Simple HTTP handler for health checks."""

def do_GET(self) -> None:
"""Handle GET requests."""
if self.path == "/health":
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(b'{"status": "ok"}')
else:
self.send_response(404)
self.end_headers()

def log_message(self, format: str, *args) -> None:
"""Suppress default logging."""
pass


class HealthServer:
"""Background health check server."""

def __init__(self, host: str = "0.0.0.0", port: int = 8000):
"""Initialize the health server.

Args:
host: Host to bind to.
port: Port to bind to.
"""
self.host = host
self.port = port
self._server: Optional[HTTPServer] = None
self._thread: Optional[threading.Thread] = None

def start(self) -> None:
"""Start the health server in a background thread."""
try:
self._server = HTTPServer((self.host, self.port), HealthHandler)
self._thread = threading.Thread(target=self._server.serve_forever, daemon=True)
self._thread.start()
log.info(f"Health server started at http://{self.host}:{self.port}/health")
except Exception as e:
log.error(f"Failed to start health server: {e}")

def stop(self) -> None:
"""Stop the health server."""
if self._server:
self._server.shutdown()
self._server = None
log.debug("Health server stopped")
Loading