diff options
| author | 2020-02-29 09:12:58 -0800 | |
|---|---|---|
| committer | 2020-03-22 15:54:42 -0700 | |
| commit | 746673dbadb1a8b9872eeeeb21155214b846bba3 (patch) | |
| tree | 8f6c7c2f5df0d8b2d31b735283132888e9c53ffa | |
| parent | HelpChannels: rename elements dict to name_positions (diff) | |
Scheduler: add a method to cancel all tasks
The dictionary which was iterated to cancel tasks is now "private".
Therefore, the scheduler should provide a public API for cancelling
tasks.
* Delete the task before cancelling it to prevent the done callback,
however unlikely it may be, from deleting the task first
| -rw-r--r-- | bot/cogs/help_channels.py | 4 | ||||
| -rw-r--r-- | bot/utils/scheduling.py | 9 |
2 files changed, 9 insertions, 4 deletions
diff --git a/bot/cogs/help_channels.py b/bot/cogs/help_channels.py index 4c83e0722..01bcc28f7 100644 --- a/bot/cogs/help_channels.py +++ b/bot/cogs/help_channels.py @@ -119,9 +119,7 @@ class HelpChannels(Scheduler, commands.Cog): for task in self.queue_tasks: task.cancel() - log.trace("Cog unload: cancelling the scheduled tasks") - for task in self.scheduled_tasks.values(): - task.cancel() + self.cancel_all() def create_channel_queue(self) -> asyncio.Queue: """ diff --git a/bot/utils/scheduling.py b/bot/utils/scheduling.py index 5760ec2d4..e9a9e6c2d 100644 --- a/bot/utils/scheduling.py +++ b/bot/utils/scheduling.py @@ -60,11 +60,18 @@ class Scheduler(metaclass=CogABCMeta): log.warning(f"{self.cog_name}: failed to unschedule {task_id} (no task found).") return - task.cancel() del self._scheduled_tasks[task_id] + task.cancel() log.debug(f"{self.cog_name}: unscheduled task #{task_id} {id(task)}.") + def cancel_all(self) -> None: + """Unschedule all known tasks.""" + log.debug(f"{self.cog_name}: unscheduling all tasks") + + for task_id in self._scheduled_tasks: + self.cancel_task(task_id) + def _task_done_callback(self, task_id: t.Hashable, done_task: asyncio.Task) -> None: """ Delete the task and raise its exception if one exists. |