From a9dba2753f942e6470feec056857c058fa21af8f Mon Sep 17 00:00:00 2001 From: Steve C Date: Fri, 16 Apr 2021 22:35:18 -0400 Subject: [PATCH] [tasks] Move the Loop's sleep to be before exit conditions This change makes it more so that `Loop.stop()` gracefully makes the current iteration the final one, by waiting AND THEN returning. The current implementation is closer to `cancel`, while also not. I encountered this because I was trying to run a `@tasks.loop(count=1)`, and inside it I print some text and change the interval, and in an `after_loop`, I restart the loop. Without this change, it immediately floods my console, due to not waiting before executing `after_loop`. --- discord/ext/tasks/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/discord/ext/tasks/__init__.py b/discord/ext/tasks/__init__.py index 818f38ad6..6a8dcb195 100644 --- a/discord/ext/tasks/__init__.py +++ b/discord/ext/tasks/__init__.py @@ -109,13 +109,13 @@ class Loop: raise await asyncio.sleep(backoff.delay()) else: + await sleep_until(self._next_iteration) + if self._stop_next_iteration: return self._current_loop += 1 if self._current_loop == self.count: break - - await sleep_until(self._next_iteration) except asyncio.CancelledError: self._is_being_cancelled = True raise