implement job runner and scheduler
This commit is contained in:
parent
328a70ff9b
commit
2b2a3f1cc0
11 changed files with 1572 additions and 284 deletions
|
|
@ -19,27 +19,31 @@ RenderFunction = Callable[[], Awaitable[RenderResult]]
|
|||
|
||||
class RefreshBroker:
|
||||
def __init__(self) -> None:
|
||||
self._subscribers: set[asyncio.Queue[object]] = set()
|
||||
self._subscribers: dict[asyncio.Queue[object], asyncio.AbstractEventLoop] = {}
|
||||
|
||||
def subscribe(self) -> asyncio.Queue[object]:
|
||||
queue: asyncio.Queue[object] = asyncio.Queue(maxsize=1)
|
||||
self._subscribers.add(queue)
|
||||
self._subscribers[queue] = asyncio.get_running_loop()
|
||||
return queue
|
||||
|
||||
def unsubscribe(self, queue: asyncio.Queue[object]) -> None:
|
||||
self._subscribers.discard(queue)
|
||||
self._subscribers.pop(queue, None)
|
||||
|
||||
def publish(self, event: object = "refresh-event") -> None:
|
||||
for queue in tuple(self._subscribers):
|
||||
if queue.full():
|
||||
try:
|
||||
queue.get_nowait()
|
||||
except asyncio.QueueEmpty:
|
||||
pass
|
||||
try:
|
||||
queue.put_nowait(event)
|
||||
except asyncio.QueueFull:
|
||||
continue
|
||||
for queue, loop in tuple(self._subscribers.items()):
|
||||
loop.call_soon_threadsafe(_publish_event, queue, event)
|
||||
|
||||
|
||||
def _publish_event(queue: asyncio.Queue[object], event: object) -> None:
|
||||
if queue.full():
|
||||
try:
|
||||
queue.get_nowait()
|
||||
except asyncio.QueueEmpty:
|
||||
pass
|
||||
try:
|
||||
queue.put_nowait(event)
|
||||
except asyncio.QueueFull:
|
||||
return
|
||||
|
||||
|
||||
async def render_sse_event(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue