50 lines
1.2 KiB
Python
50 lines
1.2 KiB
Python
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
import asyncio
|
||
|
|
from asyncio import Event
|
||
|
|
from collections import deque
|
||
|
|
from typing import Generic, TypeVar
|
||
|
|
|
||
|
|
QueueType = TypeVar("QueueType")
|
||
|
|
|
||
|
|
|
||
|
|
class Queue(Generic[QueueType]):
|
||
|
|
"""A cut-down version of asyncio.Queue
|
||
|
|
|
||
|
|
This has just enough functionality to run the message pumps.
|
||
|
|
|
||
|
|
"""
|
||
|
|
|
||
|
|
def __init__(self) -> None:
|
||
|
|
self.values: deque[QueueType] = deque()
|
||
|
|
self.ready_event = Event()
|
||
|
|
|
||
|
|
def put_nowait(self, value: QueueType) -> None:
|
||
|
|
self.values.append(value)
|
||
|
|
self.ready_event.set()
|
||
|
|
|
||
|
|
def qsize(self) -> int:
|
||
|
|
return len(self.values)
|
||
|
|
|
||
|
|
def empty(self) -> bool:
|
||
|
|
return not self.values
|
||
|
|
|
||
|
|
def task_done(self) -> None:
|
||
|
|
pass
|
||
|
|
|
||
|
|
async def get(self) -> QueueType:
|
||
|
|
if not self.ready_event.is_set():
|
||
|
|
await self.ready_event.wait()
|
||
|
|
value = self.values.popleft()
|
||
|
|
if not self.values:
|
||
|
|
self.ready_event.clear()
|
||
|
|
return value
|
||
|
|
|
||
|
|
def get_nowait(self) -> QueueType:
|
||
|
|
if not self.values:
|
||
|
|
raise asyncio.QueueEmpty()
|
||
|
|
value = self.values.popleft()
|
||
|
|
if not self.values:
|
||
|
|
self.ready_event.clear()
|
||
|
|
return value
|