From d86ef05a02e820adfd1e3a11cd56d3444d9aa2c9 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Wed, 22 Apr 2015 09:39:19 +0300 Subject: Issue #23917: Fall back to sequential compilation when ProcessPoolExecutor doesn't exist. Patch by Claudiu Popa. --- Doc/library/compileall.rst | 4 ++-- Lib/compileall.py | 4 +--- Lib/test/test_compileall.py | 8 ++++---- Misc/NEWS | 3 +++ 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Doc/library/compileall.rst b/Doc/library/compileall.rst index 57f4804..0325f1a 100644 --- a/Doc/library/compileall.rst +++ b/Doc/library/compileall.rst @@ -142,8 +142,8 @@ Public functions The argument *workers* specifies how many workers are used to compile files in parallel. The default is to not use multiple workers. If the platform can't use multiple workers and *workers* argument is given, - then a :exc:`NotImplementedError` will be raised. - If *workers* is lower than ``0``, a :exc:`ValueError` will be raised. + then sequential compilation will be used as a fallback. If *workers* is + lower than ``0``, a :exc:`ValueError` will be raised. .. versionchanged:: 3.2 Added the *legacy* and *optimize* parameter. diff --git a/Lib/compileall.py b/Lib/compileall.py index aeaaf8e..64c0a9a 100644 --- a/Lib/compileall.py +++ b/Lib/compileall.py @@ -69,11 +69,9 @@ def compile_dir(dir, maxlevels=10, ddir=None, force=False, rx=None, files = _walk_dir(dir, quiet=quiet, maxlevels=maxlevels, ddir=ddir) success = 1 - if workers is not None and workers != 1: + if workers is not None and workers != 1 and ProcessPoolExecutor is not None: if workers < 0: raise ValueError('workers must be greater or equal to 0') - if ProcessPoolExecutor is None: - raise NotImplementedError('multiprocessing support not available') workers = workers or None with ProcessPoolExecutor(max_workers=workers) as executor: diff --git a/Lib/test/test_compileall.py b/Lib/test/test_compileall.py index 07756f6..2053304 100644 --- a/Lib/test/test_compileall.py +++ b/Lib/test/test_compileall.py @@ -136,10 +136,10 @@ class CompileallTests(unittest.TestCase): self.assertTrue(compile_file_mock.called) @mock.patch('compileall.ProcessPoolExecutor', new=None) - def test_compile_missing_multiprocessing(self): - with self.assertRaisesRegex(NotImplementedError, - "multiprocessing support not available"): - compileall.compile_dir(self.directory, quiet=True, workers=5) + @mock.patch('compileall.compile_file') + def test_compile_missing_multiprocessing(self, compile_file_mock): + compileall.compile_dir(self.directory, quiet=True, workers=5) + self.assertTrue(compile_file_mock.called) class EncodingTest(unittest.TestCase): """Issue 6716: compileall should escape source code when printing errors diff --git a/Misc/NEWS b/Misc/NEWS index 0c38481..83a8da8 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -15,6 +15,9 @@ Core and Builtins Library ------- +- Issue #23917: Fall back to sequential compilation when ProcessPoolExecutor + doesn't exist. Patch by Claudiu Popa. + - Issue #23008: Fixed resolving attributes with boolean value is False in pydoc. - Fix asyncio issue 235: LifoQueue and PriorityQueue's put didn't -- cgit v0.12