John-Jiang's picture
init commit
5301c48
import threading
from typing import Any, Dict, Optional
from pydantic import BaseModel
class MutableSharedState(BaseModel):
"""A thread-safe, mutable shared state container that allows concurrent access to shared data.
This class provides a dictionary-like interface for storing and retrieving data with thread safety
ensured by a lock mechanism. It's particularly useful in multi-threaded environments where
multiple threads need to access and modify shared state.
"""
_data: Dict[str, Any] = {}
def __init__(self, initial_data: Optional[Dict[str, Any]] = None):
"""Initializes a new MutableSharedState instance.
Args:
initial_data: Optional dictionary to initialize the state with. If provided,
the state will be initialized with a copy of this dictionary.
"""
super().__init__()
self._lock = threading.RLock() # Changed to threading.Lock
if initial_data is not None:
self._data = initial_data.copy()
# Use data when you want to emphasize you're accessing the current state
@property
def data(self) -> Dict[str, Any]:
"""Returns a copy of the current state as a dictionary."""
return self.to_dict()
@data.setter
def data(self, value: Dict[str, Any]) -> None:
"""Sets the entire state with a new dictionary.
Args:
value: Dictionary containing the new state values
"""
with self._lock:
self._data = value.copy()
def get(self, key: str) -> Any:
"""Retrieves a value from the state by key.
Args:
key: The key to look up in the state
Returns:
The value associated with the key, or None if the key doesn't exist
"""
with self._lock:
return self._data.get(key)
def set(self, key: str, value: Any) -> None:
"""Sets a value in the state by key.
Args:
key: The key to set
value: The value to associate with the key
"""
with self._lock:
self._data[key] = value
def update(self, updates: Dict[str, Any]) -> None:
"""Updates multiple values in the state.
Args:
updates: Dictionary of key-value pairs to update
"""
with self._lock:
self._data.update(updates)
# Use to_dict when you want to emphasize you're converting/serializing the state
def to_dict(self) -> Dict[str, Any]:
"""Returns a copy of the current state as a dictionary.
Returns:
A copy of the current state dictionary
"""
with self._lock:
return self._data.copy()
# # Set the entire state
# state.data = {"key": "value"}
# # Get the entire state
# current_state = state.data
# # Set a value
# state.set("key", "value")
# # Get a value
# value = state.get("key")
# # Update multiple values
# state.update({"key1": "value1", "key2": "value2"})
# # Get a copy of the entire state
# state_dict = state.to_dict()