async def test_wait_cancel_pending_tasks_on_completion(event_loop): token = CancelToken("token") token2 = CancelToken("token2") chain = token.chain(token2) event_loop.call_soon(token2.trigger) await chain.wait() await assert_only_current_task_not_done()
def test_token_chain_trigger_first(): token = CancelToken("token") token2 = CancelToken("token2") token3 = CancelToken("token3") chain = token.chain(token2).chain(token3) assert not chain.triggered token.trigger() assert chain.triggered assert chain.triggered_token == token
def test_token_chain_trigger_last(): token = CancelToken("token") token2 = CancelToken("token2") token3 = CancelToken("token3") intermediate_chain = token.chain(token2) chain = intermediate_chain.chain(token3) assert not chain.triggered token3.trigger() assert chain.triggered assert chain.triggered_token == token3 assert not intermediate_chain.triggered
def __init__( self, token: CancelToken = None, loop: asyncio.AbstractEventLoop = None ) -> None: self.events = ServiceEvents() self._run_lock = asyncio.Lock() self._child_services = WeakSet() self._tasks = WeakSet() self._finished_callbacks = [] self._loop = loop base_token = CancelToken(type(self).__name__, loop=loop) if token is None: self.cancel_token = base_token else: self.cancel_token = base_token.chain(token)
async def wait_first(self, *awaitables: Awaitable[_TReturn], token: CancelToken = None, timeout: float = None) -> _TReturn: """ Wait for the first awaitable to complete, unless we timeout or the token chain is triggered. The given token is chained with this service's token, so triggering either will cancel this. Returns the result of the first one to complete. Raises TimeoutError if we timeout or OperationCancelled if the token chain is triggered. All pending futures are cancelled before returning. """ if token is None: token_chain = self.cancel_token else: token_chain = token.chain(self.cancel_token) return await token_chain.cancellable_wait(*awaitables, timeout=timeout)
def test_token_chain_event_loop_mismatch(): token = CancelToken("token") token2 = CancelToken("token2", loop=asyncio.new_event_loop()) with pytest.raises(EventLoopMismatch): token.chain(token2)