From ef9bb79e91a6b7b03f9faf61f1f7cc59eefe15f1 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 240fc42e5..d2ae2c750 100644 --- a/discord/ext/tasks/__init__.py +++ b/discord/ext/tasks/__init__.py @@ -111,13 +111,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