async def __asubscribe__(self, observer: AsyncObserver) -> AsyncDisposable:
        task = None

        assert isinstance(observer, AsyncObserver)

        async def cancel():
            task.cancel()

        sub = AsyncDisposable(cancel)

        async def worker() -> None:
            async for value in self.iterable:
                try:
                    await observer.asend(value)
                except Exception as ex:
                    await observer.athrow(ex)
                    return

            await observer.aclose()

        try:
            task = asyncio.ensure_future(worker())
        except Exception as ex:
            log.debug("FromIterable:worker(), Exception: %s" % ex)
            await observer.athrow(ex)
        return sub
Exemple #2
0
    async def __asubscribe__(self, observer: AsyncObserver) -> AsyncDisposable:
        async def cancel() -> None:
            if self._subscription is not None:
                await self._subscription.adispose()

            if self._task is not None:
                self._task.cancel()

        self._task = asyncio.ensure_future(self.worker(observer))
        return AsyncDisposable(cancel)
Exemple #3
0
    async def __asubscribe__(self, observer: AsyncObserver) -> AsyncDisposable:
        tasks = []  # type: List[asyncio.Task]

        sink = Delay.Sink(self, tasks)
        down = await chain(sink, observer)
        up = await chain(self._source, sink)

        async def cancel():
            for task in tasks:
                task.cancel()

        return AsyncCompositeDisposable(up, down, AsyncDisposable(cancel))
Exemple #4
0
    async def __asubscribe__(self, observer) -> AsyncDisposable:
        """Start streaming."""

        async def worker(value) -> None:
            """Task for sending value."""

            try:
                log.debug("Unit:__asubscribe__:worker:sending: %s", str(value))
                await observer.asend(value)
            except Exception as ex:
                try:
                    await observer.athrow(ex)
                except Exception as ex:
                    log.error("Unhandled exception: ", ex)
                    return

            await observer.aclose()

        async def done() -> None:
            """Called when future resolves."""

            try:
                value = self._value.result()
            except asyncio.CancelledError:
                await observer.aclose()
            except Exception as ex:
                try:
                    await observer.athrow(ex)
                except Exception as ex:
                    log.error("Unhandled exception: ", ex)
                    return
            else:
                await worker(value)

        def done_callback(fut):
            asyncio.ensure_future(done())

        async def dispose():
            if hasattr(self._value, "remove_done_callback"):
                self._value.remove_done_callback(done_callback)

        disposable = AsyncDisposable(dispose)

        # Check if plain value or Future (async value)
        if hasattr(self._value, "add_done_callback"):
            self._value.add_done_callback(done_callback)

        else:
            asyncio.ensure_future(worker(self._value))

        log.debug("Unit:done")
        return disposable
Exemple #5
0
 async def __asubscribe__(self, observer: AsyncObserver) -> AsyncDisposable:
     return AsyncDisposable()