docs: def run(self, tasks=None, timeout=None):
          """Block, run loop until all tasks completed."""
          timeout = self._timeout if timeout is None else timeout
          if self.async_running or self.loop.is_running():
              return self.wait_all_tasks_done(timeout)
          else:
              tasks = tasks or self.todo_tasks
              return self.loop.run_until_complete(asyncio.gather(*tasks, loop=self.loop))