I\'m trying 2 ways to stop an infinite loop from running:
task.cancel()
itself doesn't finish the task: it just says to task that CancelledError
should be raised inside it and returns immediately. You should call it and await while task would be actually cancelled (while it'll raise CancelledError
).
You also shouldn't suppress CancelledError
inside task.
Read this answer where I tried to show different ways of working with tasks. For example to cancel some task and await it cancelled you can do:
from contextlib import suppress
task = ... # remember, task doesn't suppress CancelledError itself
task.cancel() # returns immediately, we should await task raised CancelledError.
with suppress(asyncio.CancelledError):
await task # or loop.run_until_complete(task) if it happens after event loop stopped
# Now when we awaited for CancelledError and handled it,
# task is finally over and we can close event loop without warning.