From bc0b1b4bb4afd3932a60f9da98a2871623187446 Mon Sep 17 00:00:00 2001 From: Kohaku-Blueleaf <59680068+KohakuBlueleaf@users.noreply.github.com> Date: Tue, 28 Oct 2025 13:52:57 +0800 Subject: [PATCH] non-blocking read + no import in function --- src/kohakuboard/api/runs.py | 13 ++++++++----- src/kohakuboard/api/utils/board_reader_hybrid.py | 3 +-- src/kohakuboard/client/storage/hybrid.py | 8 ++------ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/kohakuboard/api/runs.py b/src/kohakuboard/api/runs.py index 9e6bd90..79ce281 100644 --- a/src/kohakuboard/api/runs.py +++ b/src/kohakuboard/api/runs.py @@ -4,6 +4,9 @@ Unified API for accessing run data (scalars, media, tables, histograms). Works in both local and remote modes with project-based organization. """ +import asyncio +import json +from datetime import datetime, timezone from pathlib import Path from fastapi import APIRouter, Depends, HTTPException, Query @@ -71,10 +74,12 @@ async def get_run_status( # Check metadata for creation time metadata_file = run_path / "metadata.json" if metadata_file.exists(): - import json + # Use asyncio.to_thread to avoid blocking + def read_metadata(): + with open(metadata_file, "r") as f: + return json.load(f) - with open(metadata_file, "r") as f: - metadata = json.load(f) + metadata = await asyncio.to_thread(read_metadata) else: metadata = {} @@ -94,8 +99,6 @@ async def get_run_status( # Convert timestamp ms to ISO string ts_ms = latest_step_info.get("timestamp") if ts_ms: - from datetime import datetime, timezone - last_updated = datetime.fromtimestamp( ts_ms / 1000, tz=timezone.utc ).isoformat() diff --git a/src/kohakuboard/api/utils/board_reader_hybrid.py b/src/kohakuboard/api/utils/board_reader_hybrid.py index 3548d21..61bb7dd 100644 --- a/src/kohakuboard/api/utils/board_reader_hybrid.py +++ b/src/kohakuboard/api/utils/board_reader_hybrid.py @@ -11,6 +11,7 @@ import time from pathlib import Path from typing import Any, Dict, List, Optional +import numpy as np from lance.dataset import LanceDataset from loguru import logger @@ -451,8 +452,6 @@ class HybridBoardReader: num_bins = len(counts) # Reconstruct bin edges from min/max/num_bins - import numpy as np - bin_edges = np.linspace(min_val, max_val, num_bins + 1).tolist() result.append( diff --git a/src/kohakuboard/client/storage/hybrid.py b/src/kohakuboard/client/storage/hybrid.py index 2b83546..ca2f715 100644 --- a/src/kohakuboard/client/storage/hybrid.py +++ b/src/kohakuboard/client/storage/hybrid.py @@ -6,6 +6,8 @@ Combines the best of both worlds: - Adaptive histograms: Lance with percentile-based range tracking """ +import time +from datetime import datetime, timezone from pathlib import Path from typing import Any, Dict, List, Optional @@ -93,8 +95,6 @@ class HybridStorage: caption: Optional caption """ # Record step info (use current timestamp) - from datetime import datetime, timezone - timestamp_ms = int(datetime.now(timezone.utc).timestamp() * 1000) self.metadata_storage.append_step_info(step, global_step, timestamp_ms) @@ -116,8 +116,6 @@ class HybridStorage: table_data: Table dict """ # Record step info - from datetime import datetime, timezone - timestamp_ms = int(datetime.now(timezone.utc).timestamp() * 1000) self.metadata_storage.append_step_info(step, global_step, timestamp_ms) @@ -143,8 +141,6 @@ class HybridStorage: precision: "compact" (uint8) or "exact" (int32) """ # Record step info - from datetime import datetime, timezone - timestamp_ms = int(datetime.now(timezone.utc).timestamp() * 1000) self.metadata_storage.append_step_info(step, global_step, timestamp_ms)