Source code for aiomisc.context
import asyncio
from collections import defaultdict
from typing import Any
from aiomisc.counters import Statistic
_StorageType = defaultdict[Any, asyncio.Future]
_EventObjectStoreType = dict[asyncio.AbstractEventLoop, "Context"]
class ContextStatistic(Statistic):
get: int
set: int
[docs]
class Context:
__slots__ = ("_loop", "_statistic", "_storage")
_EVENT_OBJECTS = {} # type: _EventObjectStoreType
[docs]
def close(self) -> None:
self._storage.clear()
self._EVENT_OBJECTS.pop(self._loop, None)
def __init__(self, loop: asyncio.AbstractEventLoop):
self._loop = loop
self._storage = defaultdict(loop.create_future) # type: _StorageType
self._EVENT_OBJECTS[loop] = self
self._statistic = ContextStatistic()
def __getitem__(self, item: Any) -> Any:
self._statistic.get += 1
return self._storage[item]
def __setitem__(self, item: Any, value: Any) -> None:
self._statistic.set += 1
self._loop.call_soon_threadsafe(self.__setter, item, value)
def __setter(self, item: Any, value: Any) -> None:
if self._storage[item].done():
del self._storage[item]
self._storage[item].set_result(value)
[docs]
def get_context(loop: asyncio.AbstractEventLoop | None = None) -> Context:
loop = loop or asyncio.get_event_loop()
if loop.is_closed():
raise RuntimeError("event loop is closed")
return Context._EVENT_OBJECTS[loop]
__all__ = ("Context", "get_context")