The loop must not be running when this function is called.
Any pending callbacks will be discarded.
- This method clears all queues and shuts down the executor, but does
- not wait for the executor to finish.
+ This method clears all queues and shuts down the default executor. By
+ default, it waits for the default executor to finish. Set
+ *loop.wait_executor_on_close* to ``False`` to not wait for the executor.
This method is idempotent and irreversible. No other methods
should be called after the event loop is closed.
+ .. versionchanged:: 3.8
+ The method now waits for the default executor to finish by default.
+ Added *loop.wait_executor_on_close* attribute.
+
+
.. coroutinemethod:: loop.shutdown_asyncgens()
Schedule all currently open :term:`asynchronous generator` objects to
class BaseEventLoop(events.AbstractEventLoop):
def __init__(self):
+ # If true, close() waits for the default executor to finish
+ self.wait_executor_on_close = True
self._timer_cancelled_count = 0
self._closed = False
self._stopping = False
executor = self._default_executor
if executor is not None:
self._default_executor = None
- executor.shutdown(wait=False)
+ executor.shutdown(wait=self.wait_executor_on_close)
def is_closed(self):
"""Returns True if the event loop was closed."""
--- /dev/null
+:mod:`asyncio`: ``loop.close()`` now waits for the default executor to
+finish by default. Set ``loop.wait_executor_on_close`` attribute to
+``False`` to opt-in for Python 3.7 behavior (not wait for the executor to
+finish).