]> granicus.if.org Git - python/commitdiff
bpo-34037, asyncio: add BaseEventLoop.wait_executor_on_close (GH-13786)
authorVictor Stinner <vstinner@redhat.com>
Mon, 3 Jun 2019 21:31:04 +0000 (23:31 +0200)
committerGitHub <noreply@github.com>
Mon, 3 Jun 2019 21:31:04 +0000 (23:31 +0200)
Add BaseEventLoop.wait_executor_on_close attribute: true by default.

loop.close() now waits for the default executor to finish by default.
Set loop.wait_executor_on_close attribute to False to not wait for
the executor.

Doc/library/asyncio-eventloop.rst
Lib/asyncio/base_events.py
Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst [new file with mode: 0644]

index 8673f84e96382ec31e762c76c86d852f2a73b062..f75ca9a966b6d55026930f302e6afedd468939cf 100644 (file)
@@ -140,12 +140,18 @@ Running and stopping the loop
    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
index e0025397fa8a85c883341e878371ec57854167f1..b1a7f88f41165a2e6c412e5a4ed81ac90d8c539c 100644 (file)
@@ -380,6 +380,8 @@ class Server(events.AbstractServer):
 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
@@ -635,7 +637,7 @@ class BaseEventLoop(events.AbstractEventLoop):
         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."""
diff --git a/Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst b/Misc/NEWS.d/next/Library/2019-06-03-22-54-15.bpo-34037.fKNAbH.rst
new file mode 100644 (file)
index 0000000..fb2f7a5
--- /dev/null
@@ -0,0 +1,4 @@
+: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).