[stdlib-sig] futures - a new package for asynchronous execution

Brian Quinlan brian at sweetapp.com
Sat Nov 7 08:57:05 CET 2009


On 7 Nov 2009, at 18:37, inhahe wrote:

> i don't understand this at all
> i hope you will provide a basic explanation of what we're doing for  
> us simpletons :P
>

Sure, but next time could you ask a more precise question? ;-)

# Create a pool of threads to execute calls.
with futures.ThreadPoolExecutor(max_threads=5) as executor:
   # Schedule the given calls to run using the thread pool created  
above and
   # return a FutureList (a list of Futures + some convenience  
methods). Called
   # without the "return_when" argument, waits until all calls are  
complete.
   futures_list = executor.run_to_futures(...)

# Iterate through every Future. A Future represents one of the  
asynchronous
# calls.
for url, future in zip(URLS, future_list):
   # Check if the call raised an exception.
   if future.exception() is not None:
     # Print the exception
     print('%r generated an exception: %s' % (url, future.exception()))
   else:
     # The call returned successfully so future.result() contains the  
return
     # value.
     print('%r page is %d bytes' % (url, len(future.result())))

Cheers,
Brian

> import futures
> import functools
> import urllib.request
>
> URLS = [
>   'http://www.foxnews.com/',
>   'http://www.cnn.com/',
>   'http://europe.wsj.com/',
>   'http://www.bbc.co.uk/',
>   'http://some-made-up-domain.com/']
>
> def load_url(url, timeout):
>   return urllib.request.urlopen(url, timeout=timeout).read()
>
> # Use a thread pool with 5 threads to download the URLs. Using a pool
> # of processes would involve changing the initialization to:
> #   with futures.ProcessPoolExecutor(max_processes=5) as executor
> with futures.ThreadPoolExecutor(max_threads=5) as executor:

>   future_list = executor.run_to_futures(
>       [functools.partial(load_url, url, 30) for url in URLS])
>
> # Check the results of each future.
> for url, future in zip(URLS, future_list):
>   if future.exception() is not None:
>       print('%r generated an exception: %s' % (url,  
> future.exception()))
>   else:
>       print('%r page is %d bytes' % (url, len(future.result())))
>
> In this example, executor.run_to_futures() returns only when every  
> url has been retrieved but it is possible to return immediately, on  
> the first completion or on the first failure depending on the  
> desired work pattern.
>
> The complete docs are here:
> http://sweetapp.com/futures/
>



More information about the stdlib-sig mailing list