[Python-Dev] [PEP 3148] futures - execute computations asynchronously

Brian Quinlan brian at sweetapp.com
Fri Mar 5 07:03:02 CET 2010


Hi all,

I recently submitted a daft PEP for a package designed to make it  
easier to execute Python functions asynchronously using threads and  
processes. It lets the user focus on their computational problem  
without having to build explicit thread/process pools and work queues.

The package has been discussed on stdlib-sig but now I'd like this  
group's feedback.

The PEP lives here:
http://python.org/dev/peps/pep-3148/

Here are two examples to whet your appetites:

"""Determine if several numbers are prime."""
import futures
import math

PRIMES = [
     112272535095293,
     112582705942171,
     112272535095293,
     115280095190773,
     115797848077099,
     1099726899285419]

def is_prime(n):
     if n % 2 == 0:
         return False

     sqrt_n = int(math.floor(math.sqrt(n)))
     for i in range(3, sqrt_n + 1, 2):
         if n % i == 0:
             return False
     return True

# Uses as many CPUs as your machine has.
with futures.ProcessPoolExecutor() as executor:
     for number, is_prime in zip(PRIMES, executor.map(is_prime,  
PRIMES)):
         print('%d is prime: %s' % (number, is_prime))


"""Print out the size of the home pages of various new sites (and Fox  
News)."""
import futures
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()

with futures.ThreadPoolExecutor(max_workers=5) as executor:
     # Create a future for each URL load.
     future_to_url = dict((executor.submit(load_url, url, 60), url)
                          for url in URLS)

     # Iterate over the futures in the order that they complete.
     for future in futures.as_completed(future_to_url):
         url = future_to_url[future]
         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())))

Cheers,
Brian


More information about the Python-Dev mailing list