示例#1
0
 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()
示例#2
0
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