python/cpython · error · RuntimeError

Cannot close a running event loop

Error message

Cannot close a running event loop

What it means

Error "Cannot close a running event loop" thrown in python/cpython.

Source

Thrown at Lib/asyncio/selector_events.py:102

        ssl_protocol = sslproto.SSLProtocol(
            self, protocol, sslcontext, waiter,
            server_side, server_hostname,
            ssl_handshake_timeout=ssl_handshake_timeout,
            ssl_shutdown_timeout=ssl_shutdown_timeout,
        )
        _SelectorSocketTransport(self, rawsock, ssl_protocol,
                                 extra=extra, server=server, context=context)
        return ssl_protocol._app_transport

    def _make_datagram_transport(self, sock, protocol,
                                 address=None, waiter=None, extra=None):
        self._ensure_fd_no_transport(sock)
        return _SelectorDatagramTransport(self, sock, protocol,
                                          address, waiter, extra)

    def close(self):
        if self.is_running():
            raise RuntimeError("Cannot close a running event loop")
        if self.is_closed():
            return
        self._close_self_pipe()
        super().close()
        if self._selector is not None:
            self._selector.close()
            self._selector = None

    def _close_self_pipe(self):
        self._remove_reader(self._ssock.fileno())
        self._ssock.close()
        self._ssock = None
        self._csock.close()
        self._csock = None
        self._internal_fds -= 1

    def _make_self_pipe(self):
        # A self-socket, really. :-)

View on GitHub (pinned to bc6749cc3b)

Solutions

  1. Stop the selector event loop before closing it; ensure run_forever()/run_until_complete() has returned first.
  2. Use asyncio.run() to handle stop and close automatically.

When it happens

Trigger: Raised when loop.close() is called on a running selector event loop.

Common situations: See trigger scenarios.


AI-assisted analysis of python/cpython@bc6749cc3b (2026-08-14). Data as JSON: /api/errors/dac410a06c9f91d6. Report an issue: GitHub.