mirror of
https://github.com/HKUDS/OpenSpace.git
synced 2026-08-28 05:15:00 +00:00
114 lines
3.9 KiB
Python
114 lines
3.9 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from openspace.utils.logging import Logger
|
|
|
|
logger = Logger.get_logger(__name__)
|
|
|
|
|
|
class ExecutionScheduler:
|
|
"""Coordinates scheduler startup and lazy scheduler injection per request."""
|
|
|
|
def __init__(self, runtime: Any) -> None:
|
|
self._runtime = runtime
|
|
|
|
def __getattr__(self, name: str) -> Any:
|
|
return getattr(self._runtime, name)
|
|
|
|
def install_ensure(
|
|
self,
|
|
*,
|
|
execution_context: dict[str, Any],
|
|
low_latency_profiler: Any,
|
|
workspace_dir: str,
|
|
) -> None:
|
|
async def ensure_scheduler(context: Any | None = None) -> Any:
|
|
return await self.ensure_for_context(
|
|
execution_context=execution_context,
|
|
low_latency_profiler=low_latency_profiler,
|
|
workspace_dir=workspace_dir,
|
|
context=context,
|
|
)
|
|
|
|
execution_context["ensure_scheduler"] = ensure_scheduler
|
|
|
|
async def ensure_for_context(
|
|
self,
|
|
*,
|
|
execution_context: dict[str, Any],
|
|
low_latency_profiler: Any,
|
|
workspace_dir: str,
|
|
context: Any | None = None,
|
|
) -> Any:
|
|
scheduler_span = (
|
|
low_latency_profiler.span("scheduler.ensure")
|
|
if low_latency_profiler is not None
|
|
else None
|
|
)
|
|
task_manager = (
|
|
getattr(context, "task_manager", None)
|
|
if context is not None and getattr(context, "task_manager", None) is not None
|
|
else execution_context.get("task_manager")
|
|
)
|
|
if scheduler_span is not None:
|
|
with scheduler_span:
|
|
scheduler = await self.ensure_scheduler(
|
|
workspace_dir,
|
|
task_manager=task_manager,
|
|
)
|
|
else:
|
|
scheduler = await self.ensure_scheduler(
|
|
workspace_dir,
|
|
task_manager=task_manager,
|
|
)
|
|
|
|
execution_context["scheduler"] = scheduler
|
|
execution_context["notification_service"] = scheduler.notification_service
|
|
execution_context["approval_service"] = scheduler.approval_service
|
|
if context is not None:
|
|
try:
|
|
context.scheduler = scheduler
|
|
context.notification_service = scheduler.notification_service
|
|
context.approval_service = scheduler.approval_service
|
|
except Exception:
|
|
pass
|
|
if low_latency_profiler is not None:
|
|
marker = getattr(low_latency_profiler, "mark", None)
|
|
if callable(marker):
|
|
marker("scheduler.initialize_started", phase="execute")
|
|
logger.info("scheduler.initialize_started")
|
|
return scheduler
|
|
|
|
async def maybe_start(
|
|
self,
|
|
*,
|
|
task: str,
|
|
execution_context: dict[str, Any],
|
|
low_latency_profiler: Any,
|
|
workspace_dir: str,
|
|
) -> None:
|
|
should_start = self.should_start_scheduler_for_execute(task, execution_context)
|
|
if not should_start:
|
|
should_start = self.workspace_has_enabled_schedules(workspace_dir)
|
|
if should_start:
|
|
ensure_scheduler = execution_context.get("ensure_scheduler")
|
|
if callable(ensure_scheduler):
|
|
await ensure_scheduler()
|
|
else:
|
|
await self.ensure_for_context(
|
|
execution_context=execution_context,
|
|
low_latency_profiler=low_latency_profiler,
|
|
workspace_dir=workspace_dir,
|
|
)
|
|
return
|
|
|
|
if low_latency_profiler is not None:
|
|
marker = getattr(low_latency_profiler, "mark", None)
|
|
if callable(marker):
|
|
marker(
|
|
"scheduler.initialize_skipped_by_profile",
|
|
phase="execute",
|
|
profile=self.config.capability_profile,
|
|
)
|
|
logger.info("scheduler.initialize_skipped_by_profile")
|