def __init__(self, loop: asyncio.BaseEventLoop, config: 'Config', blob_manager: 'BlobFileManager', peer_queue: asyncio.Queue): self.loop = loop self.config = config self.blob_manager = blob_manager self.peer_queue = peer_queue self.active_connections: typing.Dict['KademliaPeer', asyncio.Task] = {} # active request_blob calls self.ignored: typing.Dict['KademliaPeer', int] = {} self.scores: typing.Dict['KademliaPeer', int] = {} self.connections: typing.Dict['KademliaPeer', asyncio.Transport] = {} self.time_since_last_blob = loop.time()
def get_time_accelerator( loop: asyncio.BaseEventLoop, now: typing.Optional[float] = None ) -> typing.Callable[[float], typing.Awaitable[None]]: """ Returns an async advance() function This provides a way to advance() the BaseEventLoop.time for the scheduled TimerHandles made by call_later, call_at, and call_soon. """ _time = now or loop.time() loop.time = functools.wraps(loop.time)(lambda: _time) async def accelerate_time(seconds: float) -> None: nonlocal _time if seconds < 0: raise ValueError( 'Cannot go back in time ({} seconds)'.format(seconds)) _time += seconds await past_events() await asyncio.sleep(0) async def past_events() -> None: while loop._scheduled: timer: asyncio.TimerHandle = loop._scheduled[0] if timer not in loop._ready and timer._when <= _time: loop._scheduled.remove(timer) loop._ready.append(timer) if timer._when > _time: break await asyncio.sleep(0) async def accelerator(seconds: float): steps = seconds * 10.0 for _ in range(max(int(steps), 1)): await accelerate_time(0.1) return accelerator