simplified notification code
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
from .private import AsyncQueueIterator
|
from .private import AsyncQueueIterator
|
||||||
from asyncio import Queue, AbstractEventLoop, Future, CancelledError
|
from asyncio import Queue, AbstractEventLoop, Future, CancelledError, timeout
|
||||||
from typing import Callable, Optional
|
from typing import Callable, Optional
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
|
||||||
@@ -23,25 +23,16 @@ class Subscriber:
|
|||||||
self._unsubscribe_callback(self)
|
self._unsubscribe_callback(self)
|
||||||
log.debug('Deleted subscriber %s', id(self))
|
log.debug('Deleted subscriber %s', id(self))
|
||||||
|
|
||||||
async def wait(self, tout: float) -> bool:
|
async def wait(self, tout: Optional[float]) -> bool:
|
||||||
self._event = self._loop.create_future()
|
|
||||||
|
|
||||||
def callback() -> None:
|
future = self._loop.create_future()
|
||||||
evt = self._event
|
self._event = future
|
||||||
if evt is None:
|
|
||||||
raise ValueError('Event is None')
|
|
||||||
evt.cancel()
|
|
||||||
if not evt.done():
|
|
||||||
evt.set_result(False)
|
|
||||||
|
|
||||||
handle = self._loop.call_later(tout, callback)
|
|
||||||
try:
|
try:
|
||||||
log.debug('Subscriber %s is waiting for an event', id(self))
|
async with timeout(tout):
|
||||||
return await self._event
|
log.debug('Subscriber %s is waiting for an event', id(self))
|
||||||
except CancelledError:
|
await future
|
||||||
|
except TimeoutError:
|
||||||
return False
|
return False
|
||||||
finally:
|
|
||||||
handle.cancel()
|
|
||||||
|
|
||||||
def notify(self) -> None:
|
def notify(self) -> None:
|
||||||
log.debug('Subscriber %s notified', id(self))
|
log.debug('Subscriber %s notified', id(self))
|
||||||
|
Reference in New Issue
Block a user