]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-113205: test_multiprocessing.test_terminate: Test the API on threadpools (#114186)
authorPetr Viktorin <encukou@gmail.com>
Thu, 18 Jan 2024 01:15:29 +0000 (02:15 +0100)
committerGitHub <noreply@github.com>
Thu, 18 Jan 2024 01:15:29 +0000 (17:15 -0800)
gh-113205: test_multiprocessing.test_terminate: Test the API works on threadpools

Threads can't be forced to terminate (without potentially corrupting too much
state), so the  expected behaviour of `ThreadPool.terminate` is to wait for
the currently executing tasks to finish.

The entire test was skipped in GH-110848 (0e9c364f4ac18a2237bdbac702b96bcf8ef9cb09).
Instead of skipping it entirely, we should ensure the API eventually succeeds:
use a shorter timeout.

For the record: on my machine, when the test is un-skipped, the task manages to
start in about 1.5% cases.

Lib/test/_test_multiprocessing.py

index 8e4e0765d4680901f34cf30254d93e836ee254ed..6a050fa541db1ed4bcef0be4d4e71718e65ed01e 100644 (file)
@@ -2693,12 +2693,17 @@ class _TestPool(BaseTestCase):
                 p.join()
 
     def test_terminate(self):
+        # Simulate slow tasks which take "forever" to complete
+        sleep_time = support.LONG_TIMEOUT
+
         if self.TYPE == 'threads':
-            self.skipTest("Threads cannot be terminated")
+            # Thread pool workers can't be forced to quit, so if the first
+            # task starts early enough, we will end up waiting for it.
+            # Sleep for a shorter time, so the test doesn't block.
+            sleep_time = 1
 
-        # Simulate slow tasks which take "forever" to complete
         p = self.Pool(3)
-        args = [support.LONG_TIMEOUT for i in range(10_000)]
+        args = [sleep_time for i in range(10_000)]
         result = p.map_async(time.sleep, args, chunksize=1)
         p.terminate()
         p.join()