[Piglit] [PATCH v2] framework/profile.py: raise exception from pool.

Jose Fonseca jfonseca at vmware.com
Wed Dec 9 00:09:11 PST 2015


On 07/12/15 20:25, baker.dylan.c at gmail.com wrote:
> From: Dylan Baker <baker.dylan.c at gmail.com>
>
> By using Multiprocessing.dummy.Pool.apply_async() instead of .imap(), an
> exception in the thread can be raised stopping the run of the suite.
>
> v2: - Actually run in parallel.
>
> Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
>
> There is not a noticeable change in performance, and there is no change
> in results with this change.
> ---
>   framework/profile.py | 23 +++++++++++++++++------
>   1 file changed, 17 insertions(+), 6 deletions(-)
>
> diff --git a/framework/profile.py b/framework/profile.py
> index 32ed759..8643af6 100644
> --- a/framework/profile.py
> +++ b/framework/profile.py
> @@ -248,22 +248,33 @@ class TestProfile(object):
>
>           self._pre_run_hook()
>
> -        chunksize = 1
> -
>           self._prepare_test_list()
>           log = LogManager(logger, len(self.test_list))
>
> -        def test(pair):
> +        def test(name, test):
>               """Function to call test.execute from map"""
> -            name, test = pair
>               with backend.write_test(name) as w:
>                   test.execute(name, log.get(), self.dmesg)
>                   w(test.result)
>
>           def run_threads(pool, testlist):
> -            """ Open a pool, close it, and join it """
> -            pool.imap(test, testlist, chunksize)
> +            """Run all of the tests, and look for exceptions.
> +
> +            This creates a list of results, and then checks them. the only
> +            reason to check each result is that if there is an exception then
> +            it will be raised in the main thread rather than in the worker
> +            threads.
> +
> +            """
> +            results = []
> +            for pair in testlist:
> +                results.append(pool.apply_async(test, pair))

I'm surprised this makes a difference.  I'd imagine that imap would 
behave the same way.

Regardless of this change, I wonder if we should have a 
catch-all-exception right at the top of test() function, that dumps the 
exception and aborts.  Just in case the internals of multiprocessing 
change again.

Eitherway,

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>

> +
>               pool.close()
> +
> +            for r in results:
> +                r.get()
> +
>               pool.join()
>
>           # Multiprocessing.dummy is a wrapper around Threading that provides a
>


Jose


More information about the Piglit mailing list