Spaces:
Running
Running
File size: 2,303 Bytes
ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd e9015b1 ef7c8cd | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | """Shared progress state — polled by UI timer during long translation.
Per-session: mỗi phiên Gradio (tab/trình duyệt, key theo request.session_hash)
có ProgressState riêng — nhiều người dùng đồng thời (HF Space) không đè thanh
tiến trình của nhau. Handler không lấy được session (None) rơi về key mặc định,
tức hành vi global cũ — an toàn cho single-user local và mọi đường gọi cũ.
"""
from __future__ import annotations
import threading
from collections import OrderedDict
from dataclasses import dataclass
@dataclass
class ProgressState:
pct: float = 0.0
message: str = "Sẵn sàng."
running: bool = False
_DEFAULT_KEY = "__default__"
_MAX_SESSIONS = 256 # LRU cap — Space chạy dài ngày không tích state vô hạn
_lock = threading.Lock()
_states: OrderedDict[str, ProgressState] = OrderedDict()
def _state_for(session: str | None) -> ProgressState:
"""Lấy state của session, tạo mới nếu chưa có. Phải gọi TRONG _lock."""
key = session or _DEFAULT_KEY
state = _states.get(key)
if state is None:
state = ProgressState()
_states[key] = state
_states.move_to_end(key)
while len(_states) > _MAX_SESSIONS:
_states.popitem(last=False)
return state
def set_progress(
pct: float,
message: str,
*,
running: bool = True,
session: str | None = None,
) -> None:
with _lock:
state = _state_for(session)
state.pct = max(0.0, min(100.0, float(pct)))
state.message = message
state.running = running
def finish_progress(message: str, *, session: str | None = None) -> None:
with _lock:
state = _state_for(session)
state.pct = 100.0
state.message = message
state.running = False
def reset_progress(message: str = "Sẵn sàng.", *, session: str | None = None) -> None:
with _lock:
state = _state_for(session)
state.pct = 0.0
state.message = message
state.running = False
def snapshot(session: str | None = None) -> ProgressState:
with _lock:
state = _state_for(session)
return ProgressState(
pct=state.pct,
message=state.message,
running=state.running,
)
|