fa45d8aa5f
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
Privoxy对node122:18003返回500,直连正常
86 lines
2.8 KiB
Python
86 lines
2.8 KiB
Python
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
|
|
from __future__ import annotations
|
|
|
|
import threading
|
|
from typing import Any, Callable
|
|
|
|
EventHandler = Callable[..., Any]
|
|
|
|
|
|
class EventHandlerRegistry:
|
|
"""Thread-safe (optional) registry of event handlers."""
|
|
|
|
def __init__(self, *, use_lock: bool = False) -> None:
|
|
self._handlers: dict[str, list[EventHandler]] = {}
|
|
self._once_ids: set[int] = set()
|
|
self._lock: threading.Lock | None = threading.Lock() if use_lock else None
|
|
|
|
def _acquire(self) -> None:
|
|
if self._lock is not None:
|
|
self._lock.acquire()
|
|
|
|
def _release(self) -> None:
|
|
if self._lock is not None:
|
|
self._lock.release()
|
|
|
|
def add(self, event_type: str, handler: EventHandler, *, once: bool = False) -> None:
|
|
self._acquire()
|
|
try:
|
|
handlers = self._handlers.setdefault(event_type, [])
|
|
handlers.append(handler)
|
|
if once:
|
|
self._once_ids.add(id(handler))
|
|
finally:
|
|
self._release()
|
|
|
|
def remove(self, event_type: str, handler: EventHandler) -> None:
|
|
self._acquire()
|
|
try:
|
|
handlers = self._handlers.get(event_type)
|
|
if handlers is not None:
|
|
try:
|
|
handlers.remove(handler)
|
|
except ValueError:
|
|
pass
|
|
self._once_ids.discard(id(handler))
|
|
finally:
|
|
self._release()
|
|
|
|
def get_handlers(self, event_type: str) -> list[EventHandler]:
|
|
"""Return a snapshot of handlers for the given event type, removing once-handlers."""
|
|
self._acquire()
|
|
try:
|
|
handlers = self._handlers.get(event_type)
|
|
if not handlers:
|
|
return []
|
|
result = list(handlers)
|
|
to_remove = [h for h in result if id(h) in self._once_ids]
|
|
for h in to_remove:
|
|
handlers.remove(h)
|
|
self._once_ids.discard(id(h))
|
|
return result
|
|
finally:
|
|
self._release()
|
|
|
|
def has_handlers(self, event_type: str) -> bool:
|
|
self._acquire()
|
|
try:
|
|
handlers = self._handlers.get(event_type)
|
|
return bool(handlers)
|
|
finally:
|
|
self._release()
|
|
|
|
def merge_into(self, target: EventHandlerRegistry) -> None:
|
|
"""Move all handlers from this registry into *target*, then clear self."""
|
|
self._acquire()
|
|
try:
|
|
for event_type, handlers in self._handlers.items():
|
|
for handler in handlers:
|
|
once = id(handler) in self._once_ids
|
|
target.add(event_type, handler, once=once)
|
|
self._handlers.clear()
|
|
self._once_ids.clear()
|
|
finally:
|
|
self._release()
|