changeset: 95758:572dc6bdc0a3 user: Berker Peksag date: Wed Apr 22 09:39:19 2015 +0300 files: Doc/library/compileall.rst Lib/compileall.py Lib/test/test_compileall.py Misc/NEWS description: Issue #23917: Fall back to sequential compilation when ProcessPoolExecutor doesn't exist. Patch by Claudiu Popa. diff -r 25c03271860d -r 572dc6bdc0a3 Doc/library/compileall.rst --- a/Doc/library/compileall.rst Tue Apr 21 19:44:54 2015 -0400 +++ b/Doc/library/compileall.rst Wed Apr 22 09:39:19 2015 +0300 @@ -142,8 +142,8 @@ 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 -r 25c03271860d -r 572dc6bdc0a3 Lib/compileall.py --- a/Lib/compileall.py Tue Apr 21 19:44:54 2015 -0400 +++ b/Lib/compileall.py Wed Apr 22 09:39:19 2015 +0300 @@ -69,11 +69,9 @@ 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 -r 25c03271860d -r 572dc6bdc0a3 Lib/test/test_compileall.py --- a/Lib/test/test_compileall.py Tue Apr 21 19:44:54 2015 -0400 +++ b/Lib/test/test_compileall.py Wed Apr 22 09:39:19 2015 +0300 @@ -136,10 +136,10 @@ 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 -r 25c03271860d -r 572dc6bdc0a3 Misc/NEWS --- a/Misc/NEWS Tue Apr 21 19:44:54 2015 -0400 +++ b/Misc/NEWS Wed Apr 22 09:39:19 2015 +0300 @@ -15,6 +15,9 @@ 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