Skip to content

Commit ace0f92

Browse files
committed
fix: To prevent concurrent registration errors when multiple threads attempt to acquire an object.
1 parent 51524a0 commit ace0f92

File tree

1 file changed

+10
-7
lines changed
  • src/backend/bisheng/core/context

1 file changed

+10
-7
lines changed

src/backend/bisheng/core/context/base.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import asyncio
22
import time
33
from abc import ABC, abstractmethod
4-
from typing import Any, Dict, Optional, TypeVar, Generic, Callable, Awaitable, Union
4+
from contextlib import asynccontextmanager, contextmanager
55
from enum import Enum
66
from threading import Lock, Event
7-
from contextlib import asynccontextmanager, contextmanager
7+
from typing import Any, Dict, Optional, TypeVar, Generic, Callable, Awaitable, Union
88

99
from loguru import logger
1010

@@ -50,7 +50,7 @@ class BaseContextManager(ABC, Generic[T]):
5050

5151
name: str
5252
_default_timeout: float = 30.0 # 默认超时时间
53-
_default_retry_count: int = 3 # 默认重试次数
53+
_default_retry_count: int = 3 # 默认重试次数
5454

5555
def __init__(self, name: str = None, timeout: float = None, retry_count: int = None):
5656
self.name = name or getattr(self.__class__, 'name', self.__class__.__name__.lower())
@@ -163,7 +163,8 @@ async def _perform_initialization_async(self) -> T:
163163
last_error = e
164164
if attempt < self.retry_count - 1:
165165
wait_time = 2 ** attempt # 指数退避
166-
logger.warning(f"Context '{self.name}' init attempt {attempt + 1} failed: {e}, retrying in {wait_time}s")
166+
logger.warning(
167+
f"Context '{self.name}' init attempt {attempt + 1} failed: {e}, retrying in {wait_time}s")
167168
await asyncio.sleep(wait_time)
168169
else:
169170
logger.error(f"Context '{self.name}' initialization failed after {self.retry_count} attempts: {e}")
@@ -226,7 +227,8 @@ def _perform_initialization_sync(self) -> T:
226227
last_error = e
227228
if attempt < self.retry_count - 1:
228229
wait_time = 2 ** attempt # 指数退避
229-
logger.warning(f"Context '{self.name}' init attempt {attempt + 1} failed: {e}, retrying in {wait_time}s")
230+
logger.warning(
231+
f"Context '{self.name}' init attempt {attempt + 1} failed: {e}, retrying in {wait_time}s")
230232
time.sleep(wait_time)
231233
else:
232234
logger.error(f"Context '{self.name}' initialization failed after {self.retry_count} attempts: {e}")
@@ -472,7 +474,8 @@ def register(self, context_manager: BaseContextManager) -> None:
472474
"""
473475
with self._lock:
474476
if context_manager.name in self._contexts:
475-
raise ValueError(f"Context '{context_manager.name}' already registered")
477+
logger.warning(f"Context '{context_manager.name}' is already registered")
478+
return
476479
self._contexts[context_manager.name] = context_manager
477480
logger.debug(f"Registered context: '{context_manager.name}'")
478481

@@ -628,4 +631,4 @@ def __iter__(self):
628631
return iter(self._contexts.keys())
629632

630633
def __repr__(self) -> str:
631-
return f"<ContextRegistry(contexts={list(self._contexts.keys())})>"
634+
return f"<ContextRegistry(contexts={list(self._contexts.keys())})>"

0 commit comments

Comments
 (0)