Пример #1
0
async def read_stream(eos: asyncio.Future,
                      rdr: Coroutine) -> Union[_EndOfStream, Any]:
    try:
        done, _pending = await asyncio.wait(
            {eos, asyncio.create_task(rdr)},
            return_when=asyncio.FIRST_COMPLETED)
        if len(done) <= 1 and eos in done:
            # done without unprocessed item
            await eos  # reraise exception if that caused eos
            return EndOfStream
        for fut in done:
            if fut is not eos:
                if fut.cancelled():
                    if eos.done():
                        return EndOfStream
                return await fut
    except asyncio.CancelledError:
        if eos.done():
            await eos  # reraise exception if that caused eos
            return EndOfStream
        logger.debug(
            f"stream reading cancelled before eos: {eos!s}",
            exc_info=True,
            stack_info=True,
        )
        raise  # reraise as is, if not at eos yet

    assert False, "impossible to reach here"
Пример #2
0
    def run_until_complete(self, future: asyncio.Future) -> Any:
        self._check_running()

        new_task = False

        if not asyncio.isfuture(future):
            future = asyncio.ensure_future(future, loop=self)

            # We wrapped `future` in a new Task since it was not a Future.
            new_task = True

            # An exception is raised if the new task doesn't complete, so there is no need to log the "destroy
            # pending task" message.
            future._log_destroy_pending = False
        else:
            if _helpers.get_future_loop(future) is not self:
                raise ValueError("Future does not belong to this loop")

        future.add_done_callback(_run_until_complete_cb)
        try:
            self._run_mainloop()
        except:
            if new_task and future.done() and not future.cancelled():
                # The coroutine raised a BaseException. Consume the exception to not log a warning (Future
                # will log a warning if its exception is not retrieved), the caller doesn't have access to the
                # task wrapper we made.
                future.exception()
            raise
        finally:
            future.remove_done_callback(_run_until_complete_cb)

        if not future.done():
            raise RuntimeError('Event loop stopped before Future completed.')

        return future.result()
Пример #3
0
class Stream:

    def __init__(self):
        self._future = Future()
        self._complete = Event()
        self._listeners = [ ]

    def __aiter__(self):
        return self

    async def __anext__(self):

        if self._complete.is_set():
            raise StopAsyncIteration

        result = await self._future
        self._future = Future()
        return result

    def write(self, item, last):
        if self._complete.is_set():
            return
        if last:
            self._set_complete()
        if self._future.done():
            self._future = Future()
        self._future.set_result(item)

    def abort(self, exc):
        if self._complete.is_set():
            return
        self._set_complete()
        if self._future.done():
            self._future = Future()
        self._future.set_exception(exc)

    def cancel(self):
        self._set_complete()
        if self._future.done():
            self._future = Future()
        self._future.cancel()

    async def completed(self):
        await self._complete.wait()

    @property
    def is_complete(self):
        return self._complete.is_set()

    def add_complete_listener(self, listener):
        self._listeners.append(listener)

    def _set_complete(self):
        self._complete.set()
        for listener in self._listeners:
            listener()
Пример #4
0
    def _in_thread(future: asyncio.Future, func: Callable,
                   loop: asyncio.AbstractEventLoop):
        try:
            result = func()
        except Exception as e:
            if future.done():
                return

            loop.call_soon_threadsafe(future.set_exception, e)
        else:
            if future.done():
                return

            loop.call_soon_threadsafe(future.set_result, result)
Пример #5
0
def copy_result(from_: Future, to: Future) -> None:
    if not from_.done():
        raise ValueError('from_ must be a completed Future')
    if to.done():
        raise ValueError('to must NOT be a completed Future')

    if from_.cancelled():
        to.cancel()
    else:
        exception = from_.exception()
        if exception is not None:
            to.set_exception(exception)
        else:
            result = from_.result()
            to.set_result(result)
Пример #6
0
def set_future_result(future: Future,
                      result: Any) -> None:  # type: ignore # pypy
    if not future.done():
        if isinstance(result, Exception):
            future.set_exception(result)
        else:
            future.set_result(result)
 async def test_handle_response_none(self):
     transport = FAsyncTransport(1024)
     ctx = FContext()
     future = Future()
     transport._futures[str(ctx._get_op_id())] = future
     await transport.handle_response(None)
     self.assertFalse(future.done())
Пример #8
0
class Tester:
    def __init__(self):
        self.end = Future()

    def __call__(self, *args, **kwargs):
        if not self.end.done():
            self.end.set_result((args, kwargs))
Пример #9
0
    def _on_child_task_done(self, parent_task: asyncio.Future,
                            child_task: asyncio.Future):
        parent_task.child_count -= 1  # type: ignore
        try:
            metadata = child_task.result()
            if metadata and not parent_task.done():
                parent_task.set_result(metadata)
        except asyncio.CancelledError:
            pass
        except Exception as e:
            logging.debug("Child task resulted in exception")
            logger.exception(e)

        if parent_task.child_count <= 0 and not parent_task.done(
        ):  # type: ignore
            parent_task.set_result(None)
Пример #10
0
async def _send_udp_message_with_retry(
    message: str,
    transport: asyncio.DatagramTransport,
    response_future: asyncio.Future,
    ip: str,
    port: int,
) -> None:
    """Send a UDP message multiple times until we reach the maximum or a response is recieved."""
    data = message.encode("utf-8")
    send_wait = FIRST_SEND_INTERVAL
    total_waited = 0.0
    for send in range(MAX_SEND_DATAGRAMS):
        if transport.is_closing() or response_future.done():
            return
        attempt = send + 1
        _LOGGER.debug(
            "%s: >> %s (%s/%s) backoff=%s",
            ip,
            data,
            attempt,
            MAX_SEND_DATAGRAMS,
            total_waited,
        )
        transport.sendto(data, (ip, port))
        await asyncio.sleep(send_wait)
        total_waited += send_wait
        send_wait = min(send_wait * 2, MAX_BACKOFF)
                class AIterator:
                    def __init__(self):
                        self.notifications = []
                        self.future = Future()

                        source.pipe(ops.materialize()).subscribe(self.on_next)

                    def feeder(self):
                        if not self.notifications or self.future.done():
                            return

                        notification = self.notifications.pop(0)
                        dispatch = {
                            'N':
                            lambda: self.future.set_result(notification.value),
                            'E':
                            lambda: self.future.set_exception(notification.
                                                              exception),
                            'C':
                            lambda: self.future.set_exception(
                                StopAsyncIteration)
                        }

                        dispatch[notification.kind]()

                    def on_next(self, notification):
                        self.notifications.append(notification)
                        self.feeder()

                    async def __anext__(self):
                        self.feeder()

                        value = await self.future
                        self.future = Future()
                        return value
Пример #12
0
def _run_coro(future: asyncio.Future, coro: Awaitable[Any],
              callback: Callable[[str, bool], Awaitable[Any]]) -> None:
    loop = asyncio.new_event_loop()
    task = loop.create_task(coro)
    userge.loop.call_soon_threadsafe(
        future.add_done_callback, lambda _: (loop.is_running(
        ) and future.cancelled() and loop.call_soon_threadsafe(task.cancel)))
    try:
        ret, exc = None, None
        with redirect() as out:
            try:
                ret = loop.run_until_complete(task)
            except asyncio.CancelledError:
                return
            except Exception:  # pylint: disable=broad-except
                exc = traceback.format_exc().strip()
            output = exc or out.getvalue()
            if ret is not None:
                output += str(ret)
        loop.run_until_complete(callback(output, exc is not None))
    finally:
        loop.run_until_complete(loop.shutdown_asyncgens())
        loop.close()
        userge.loop.call_soon_threadsafe(
            lambda: future.done() or future.set_result(None))
Пример #13
0
def demo():
    f = Future()
    print(f.done())

    async def main(f: asyncio.Future):
        await asyncio.sleep(1)
        f.set_result('I have finished.')
        return 13

    loop = asyncio.get_event_loop()

    fut = asyncio.Future()
    # Schedule the main() coroutine, passing the future
    task = loop.create_task(main(fut))

    print(fut.done())
    print(task.done())

    # Here we use run_until_complete() on a Future instance, rather than a Task instance
    loop.run_until_complete(fut)

    print(fut.done())
    print(task.done())
    print(fut.result())
    print(task.result())
Пример #14
0
def _on_result(future: asyncio.Future, new_future: asyncio.Future = None):
    if not new_future.done():
        exc = future.exception()
        if exc:
            return new_future.set_exception(exc)

        new_future.set_result(future.result())
Пример #15
0
    async def get(self, timeout=None) -> Connection:
        async with self._alock:
            if len(self._idle_pool) > 0:
                c = self._idle_pool.pop()
                self._using_pool.add(c)
                _connectionCtxVar.set(c)
                return c

            if len(self._using_pool) < self._pool_size:
                c = await self._aopen()
                self._using_pool.add(c)
                _connectionCtxVar.set(c)
                return c

            future = Future()
            self._waiting.append(future)

        if timeout and timeout > 0:
            asyncio.get_event_loop().call_later(timeout, lambda: future.done())
        await future
        c = future.result()
        if not c:
            return c
        _connectionCtxVar.set(c)
        self._using_pool.add(c)
        return c
Пример #16
0
class MockTransport(MockObject):
    """
    This object mocks the transport of the socks5 connection.
    """
    def __init__(self, loop):
        self.connected = True
        self.written_data = []
        self.host = '123.123.123.123'
        self.ip = 123
        self.num_messages = 2
        self.done = Future(loop=loop)

    def close(self):
        self.connected = False

    def write(self, data):
        self.written_data.append(data)
        if len(self.written_data
               ) == self.num_messages and not self.done.done():
            self.done.set_result(None)

    def get_extra_info(self, *_):
        return self.host, self.ip

    async def wait_until_done(self, timeout=1):
        await wait_for(self.done, timeout=timeout)
    async def consume_messages(self, when_connected: asyncio.Future,
                               subscriptions: Subscriptions):
        """Consumes messages form the open web socket connection and forwards them to the callback"""
        self.connection = await websockets.connect(self.host, ssl=True)
        if subscriptions is None:
            # When no subscriptions are added we complete on connect
            when_connected.set_result("Connected")

        if self.api_token is not None:
            auth_message = self.get_auth_message_as_json()
            await self.send_message(auth_message)
        else:
            # Subscribe immediately if no api_token is provided - public channels need no token
            await self.subscribe(subscriptions)

        async for raw_message in self.connection:
            LOG.debug(">>> %s", raw_message)
            json_message = json.loads(raw_message)
            # Subscribe only after authentication confirmation
            if json_message["type"] == "AUTHENTICATED":
                LOG.debug("Successfully authenticated! Subscribe now.")
                await self.subscribe(subscriptions)
            elif when_connected.done() is False and json_message["type"] == "SUBSCRIPTIONS" \
                    and subscriptions is not None:
                # Complete start on subscription confirmation message
                when_connected.set_result("Connected with subscriptions")
            elif json_message["type"] == "ERROR":
                LOG.error("!!! %s", json_message)
            # Forward all events
            await self.callback(json_message)
Пример #18
0
def _stop_task(key: str, future: asyncio.Future) -> None:
    if not future.cancelled():
        future.cancel()
        logging.info(f"stop task:{key}")
    elif future.done():
        logging.warning(f"task:{key} already stop")
    else:
        logging.warning(f"{key} can't stop")
Пример #19
0
class ProgressStream:
    def __init__(self):
        self._progress = Queue()
        self._progress_task = create_task(self._progress.get())
        self._complete = Future()
        self._complete_task = create_task(self._complete)

    def __aiter__(self):
        return self

    async def __anext__(self):

        if self._complete.done():
            raise StopAsyncIteration

        done, pending = await wait({self._complete_task, self._progress_task},
                                   return_when=FIRST_COMPLETED)

        if self._complete_task in done:
            self._progress_task.cancel()
            self._complete_task.result(
            )  # throws an exception (when necessary)
            raise StopAsyncIteration
        else:
            progress = self._progress_task.result()
            self._progress_task = create_task(self._progress.get())
            return progress

    def write(self, item):
        if self._complete.done():
            raise InvalidStateError
        if self._progress.qsize() > 0:
            self._progress.get_nowait()
        self._progress.put_nowait(item)

    def set_result(self, result):
        self._complete.set_result(result)

    def set_exception(self, e):
        self._complete.set_exception(e)

    def result(self):
        return self._complete.result()

    def done(self):
        return self._complete.done()
Пример #20
0
    def set_result(future: Future, result: Any, exception: Exception) -> None:
        if future.done():
            return

        if exception:
            future.set_exception(exception)
        else:
            future.set_result(result)
Пример #21
0
class Tester:

    def __init__(self):
        self.end = Future()

    def __call__(self, *args, **kwargs):
        if not self.end.done():
            self.end.set_result((args, kwargs))
Пример #22
0
def propagate(from_: Future, to: Future) -> None:
    """
    Copy the value that ``from_`` is completed with to ``to``, whenever ``from_`` is completed.
    """
    if from_.done():
        copy_result(from_, to)
    else:
        from_.add_done_callback(lambda _: copy_result(from_, to))
Пример #23
0
 async def test_handle_response_unregistered_op_id(self):
     transport = FAsyncTransport(1024)
     ctx1 = FContext()
     ctx2 = FContext()
     future = Future()
     transport._futures[str(ctx1._get_op_id())] = future
     await transport.handle_response(utils.mock_frame(ctx2))
     self.assertFalse(future.done())
Пример #24
0
async def _awaiter(future: Future) -> T:
    try:
        result = await future
        return result
    except asyncio.CancelledError as e:
        if not future.done():
            future.set_exception(e)
        raise
Пример #25
0
async def awaiter(future: asyncio.Future) -> T:
    """等待future执行结束,返回执行结果 ."""
    try:
        result = await future
        return result
    except asyncio.CancelledError as e:
        if not future.done():
            future.set_exception(e)
        raise
Пример #26
0
def _create_job_callback(job: Job, fut: asyncio.Future):

    exc = fut.exception()
    if not fut.cancelled() and exc:
        raise exc

    if fut.done():
        job.meta_update(result=fut.result())
        job.save()
Пример #27
0
def callback(my_future: Future):
    if not my_future.done() or my_future.cancelled():
        return
    result: ExResult = my_future.result()
    if result.solver_result.satisfiable:
        return
    else:
        print("kept graph")
        with open("results_random_planar_110_filtered.json", mode="a") as f:
            print(simplejson.dumps(result), file=f)
Пример #28
0
    def _finalise_future(fut: Future) -> Optional[Union[Response, str]]:
        if fut.done():
            err = fut.exception()

            if err:
                error_logger.error("%s", err, exc_info=err)
            else:
                return fut.result()
        else:
            fut.cancel()
Пример #29
0
async def _pipe_to_companion(
    in_stream: Stream[_TSend, _TRecv],
    out_stream: Stream[_TRecv, _TSend],
    started_future: asyncio.Future,
) -> None:
    async for message in in_stream:
        await out_stream.send_message(message)
        if not started_future.done():
            started_future.set_result(None)
    await out_stream.end()
class MySubHandler:
    """
    More advanced subscription client using Future, so we can await events in tests.
    """
    def __init__(self):
        self.future = Future()

    def reset(self):
        self.future = Future()

    async def result(self):
        return await wait_for(self.future, 2)

    def datachange_notification(self, node, val, data):
        if not self.future.done():
            self.future.set_result((node, val, data))

    def event_notification(self, event):
        if not self.future.done():
            self.future.set_result(event)
Пример #31
0
 def run_job_done_callback(f: asyncio.Future):
     if f.cancelled():
         if not job.done():
             job.cancel()
     elif f.exception():
         job.set_exception(f.exception())
     elif f.done():
         job.set_result(f.result())
         # cancel should be triggered by job
     else:
         raise RuntimeError(f"Unexpected future {f}")
Пример #32
0
 def _send_request(self, app_name, endpoint, entity, params, timeout):
     packet = MessagePacket.request(self.name, self.version, app_name, _Service._REQ_PKT_STR, endpoint, params,
                                    entity)
     future = Future()
     request_id = params['request_id']
     self._pending_requests[request_id] = future
     try:
         self.tcp_bus.send(packet)
     except ClientException:
         if not future.done() and not future.cancelled():
             error = 'Client not found'
             exception = ClientException(error)
             exception.error = error
             future.set_exception(exception)
     _Service.time_future(future, timeout)
     return future
Пример #33
0
 def _send_request(self, app_name, endpoint, entity, params):
     packet = MessagePacket.request(self.name, self.version, app_name, _Service._REQ_PKT_STR, endpoint, params,
                                    entity)
     future = Future()
     request_id = params['request_id']
     self._pending_requests[request_id] = future
     try:
         self.tcp_bus.send(packet)
     except ClientException as e:
         if not future.done() and not future.cancelled():
             ERROR = '101_Client not found'
             exception = RequestException(ERROR)
             exception.error = ERROR
             future.set_exception(exception)
     _Service.time_future(future, TCPServiceClient.REQUEST_TIMEOUT_SECS)
     return future
Пример #34
0
    class SubscriberThread(threading.Thread):
        def __init__(self, topic, id):
            super().__init__(target=self)
            self.subscriber = Subscriber(topic=topic, id=id)
            self.future = Future()

        def done(self):
            return self.future.done()

        def result(self):
            return self.future.result()

        def run(self):
            try:
                self.subscriber.open()
                result = self.loop()
                self.future.set_result(result)
            except Exception as error:
                self.future.set_exception(error)
            finally:
                self.subscriber.close()

        def loop(self):
            raise NotImplementedError()
Пример #35
0
class WebSocketAdapterProtocol(asyncio.Protocol):
    """
    Adapter class for asyncio-based WebSocket client and server protocols.
    """

    def connection_made(self, transport):
        self.transport = transport

        self.receive_queue = deque()
        self._consume()

        try:
            self.peer = peer2str(transport.get_extra_info('peername'))
        except:
            self.peer = u"?"

        self._connectionMade()

    def connection_lost(self, exc):
        self._connectionLost(exc)
        # according to asyncio docs, connection_lost(None) is called
        # if something else called transport.close()
        if exc is not None:
            self.transport.close()
        self.transport = None

    def _consume(self):
        self.waiter = Future(loop=self.factory.loop or txaio.config.loop)

        def process(_):
            while len(self.receive_queue):
                data = self.receive_queue.popleft()
                if self.transport:
                    self._dataReceived(data)
            self._consume()

        self.waiter.add_done_callback(process)

    def data_received(self, data):
        self.receive_queue.append(data)
        if not self.waiter.done():
            self.waiter.set_result(None)

    def _closeConnection(self, abort=False):
        if abort and hasattr(self.transport, 'abort'):
            self.transport.abort()
        else:
            self.transport.close()

    def _onOpen(self):
        res = self.onOpen()
        if yields(res):
            ensure_future(res)

    def _onMessageBegin(self, isBinary):
        res = self.onMessageBegin(isBinary)
        if yields(res):
            ensure_future(res)

    def _onMessageFrameBegin(self, length):
        res = self.onMessageFrameBegin(length)
        if yields(res):
            ensure_future(res)

    def _onMessageFrameData(self, payload):
        res = self.onMessageFrameData(payload)
        if yields(res):
            ensure_future(res)

    def _onMessageFrameEnd(self):
        res = self.onMessageFrameEnd()
        if yields(res):
            ensure_future(res)

    def _onMessageFrame(self, payload):
        res = self.onMessageFrame(payload)
        if yields(res):
            ensure_future(res)

    def _onMessageEnd(self):
        res = self.onMessageEnd()
        if yields(res):
            ensure_future(res)

    def _onMessage(self, payload, isBinary):
        res = self.onMessage(payload, isBinary)
        if yields(res):
            ensure_future(res)

    def _onPing(self, payload):
        res = self.onPing(payload)
        if yields(res):
            ensure_future(res)

    def _onPong(self, payload):
        res = self.onPong(payload)
        if yields(res):
            ensure_future(res)

    def _onClose(self, wasClean, code, reason):
        res = self.onClose(wasClean, code, reason)
        if yields(res):
            ensure_future(res)

    def registerProducer(self, producer, streaming):
        raise Exception("not implemented")

    def unregisterProducer(self):
        # note that generic websocket/protocol.py code calls
        # .unregisterProducer whenever we dropConnection -- that's
        # correct behavior on Twisted so either we'd have to
        # try/except there, or special-case Twisted, ..or just make
        # this "not an error"
        pass
class WebSocketAdapterProtocol(asyncio.Protocol):
    """
    Adapter class for asyncio-based WebSocket client and server protocols.
    """

    def connection_made(self, transport):
        self.transport = transport

        self.receive_queue = deque()
        self._consume()

        try:
            peer = transport.get_extra_info('peername')
            try:
                # FIXME: tcp4 vs tcp6
                self.peer = u"tcp:%s:%d" % (peer[0], peer[1])
            except:
                # e.g. Unix Domain sockets don't have host/port
                self.peer = u"unix:{0}".format(peer)
        except:
            self.peer = u"?"

        self._connectionMade()

    def connection_lost(self, exc):
        self._connectionLost(exc)
        # according to asyncio docs, connection_lost(None) is called
        # if something else called transport.close()
        if exc is not None:
            self.transport.close()
        self.transport = None

    def _consume(self):
        self.waiter = Future(loop=self.factory.loop or txaio.config.loop)

        def process(_):
            while len(self.receive_queue):
                data = self.receive_queue.popleft()
                if self.transport:
                    self._dataReceived(data)
            self._consume()

        self.waiter.add_done_callback(process)

    def data_received(self, data):
        self.receive_queue.append(data)
        if not self.waiter.done():
            self.waiter.set_result(None)

    # noinspection PyUnusedLocal
    def _closeConnection(self, abort=False):
        self.transport.close()

    def _onOpen(self):
        res = self.onOpen()
        if yields(res):
            ensure_future(res)

    def _onMessageBegin(self, isBinary):
        res = self.onMessageBegin(isBinary)
        if yields(res):
            ensure_future(res)

    def _onMessageFrameBegin(self, length):
        res = self.onMessageFrameBegin(length)
        if yields(res):
            ensure_future(res)

    def _onMessageFrameData(self, payload):
        res = self.onMessageFrameData(payload)
        if yields(res):
            ensure_future(res)

    def _onMessageFrameEnd(self):
        res = self.onMessageFrameEnd()
        if yields(res):
            ensure_future(res)

    def _onMessageFrame(self, payload):
        res = self.onMessageFrame(payload)
        if yields(res):
            ensure_future(res)

    def _onMessageEnd(self):
        res = self.onMessageEnd()
        if yields(res):
            ensure_future(res)

    def _onMessage(self, payload, isBinary):
        res = self.onMessage(payload, isBinary)
        if yields(res):
            ensure_future(res)

    def _onPing(self, payload):
        res = self.onPing(payload)
        if yields(res):
            ensure_future(res)

    def _onPong(self, payload):
        res = self.onPong(payload)
        if yields(res):
            ensure_future(res)

    def _onClose(self, wasClean, code, reason):
        res = self.onClose(wasClean, code, reason)
        if yields(res):
            ensure_future(res)

    def get_channel_id(self):
        """
        Implements :func:`autobahn.wamp.interfaces.ITransport.get_channel_id`
        """
        self.log.debug('FIXME: transport channel binding not implemented for asyncio (autobahn-python issue #729)')
        return None

    def registerProducer(self, producer, streaming):
        raise Exception("not implemented")
Пример #37
0
class WebSocketAdapterProtocol(asyncio.Protocol):
    """
    Adapter class for asyncio-based WebSocket client and server protocols.
    """

    def connection_made(self, transport):
        self.transport = transport

        self.receive_queue = deque()
        self._consume()

        try:
            peer = transport.get_extra_info('peername')
            try:
                # FIXME: tcp4 vs tcp6
                self.peer = "tcp:%s:%d" % (peer[0], peer[1])
            except:
                # e.g. Unix Domain sockets don't have host/port
                self.peer = "unix:{0}".format(peer)
        except:
            self.peer = "?"

        self._connectionMade()

    def connection_lost(self, exc):
        self._connectionLost(exc)
        self.transport = None

    def _consume(self):
        self.waiter = Future()

        def process(_):
            while len(self.receive_queue):
                data = self.receive_queue.popleft()
                if self.transport:
                    self._dataReceived(data)
                else:
                    print("WebSocketAdapterProtocol._consume: no transport")
            self._consume()

        self.waiter.add_done_callback(process)

    def data_received(self, data):
        self.receive_queue.append(data)
        if not self.waiter.done():
            self.waiter.set_result(None)

    # noinspection PyUnusedLocal
    def _closeConnection(self, abort=False):
        self.transport.close()

    def _onOpen(self):
        res = self.onOpen()
        if yields(res):
            asyncio.async(res)

    def _onMessageBegin(self, isBinary):
        res = self.onMessageBegin(isBinary)
        if yields(res):
            asyncio.async(res)

    def _onMessageFrameBegin(self, length):
        res = self.onMessageFrameBegin(length)
        if yields(res):
            asyncio.async(res)

    def _onMessageFrameData(self, payload):
        res = self.onMessageFrameData(payload)
        if yields(res):
            asyncio.async(res)

    def _onMessageFrameEnd(self):
        res = self.onMessageFrameEnd()
        if yields(res):
            asyncio.async(res)

    def _onMessageFrame(self, payload):
        res = self.onMessageFrame(payload)
        if yields(res):
            asyncio.async(res)

    def _onMessageEnd(self):
        res = self.onMessageEnd()
        if yields(res):
            asyncio.async(res)

    def _onMessage(self, payload, isBinary):
        res = self.onMessage(payload, isBinary)
        if yields(res):
            asyncio.async(res)

    def _onPing(self, payload):
        res = self.onPing(payload)
        if yields(res):
            asyncio.async(res)

    def _onPong(self, payload):
        res = self.onPong(payload)
        if yields(res):
            asyncio.async(res)

    def _onClose(self, wasClean, code, reason):
        res = self.onClose(wasClean, code, reason)
        if yields(res):
            asyncio.async(res)

    def registerProducer(self, producer, streaming):
        raise Exception("not implemented")