diff --git a/discord/client.py b/discord/client.py index 85d03056f..9a12fdee6 100644 --- a/discord/client.py +++ b/discord/client.py @@ -454,7 +454,7 @@ class Client: def _do_cleanup(self): - if self.loop.is_closed() or not self.loop.is_running(): + if self.loop.is_closed(): return # we're already cleaning up self.loop.run_until_complete(self.close()) @@ -499,15 +499,29 @@ class Client: called after this function call will not execute until it returns. """ is_windows = sys.platform == 'win32' + loop = self.loop if not is_windows: - self.loop.add_signal_handler(signal.SIGINT, self._do_cleanup) - self.loop.add_signal_handler(signal.SIGTERM, self._do_cleanup) + loop.add_signal_handler(signal.SIGINT, self._do_cleanup) + loop.add_signal_handler(signal.SIGTERM, self._do_cleanup) + + task = compat.create_task(self.start(*args, **kwargs), loop=loop) + + def kill_loop_on_finish(fut): + try: + fut.result() + except: + pass # don't care + finally: + loop.stop() + + task.add_done_callback(kill_loop_on_finish) try: - self.loop.run_until_complete(self.start(*args, **kwargs)) + loop.run_forever() except KeyboardInterrupt: pass finally: + task.remove_done_callback(kill_loop_on_finish) if is_windows: self._do_cleanup()