Comenzando en Python 3.2, puede usar concurrent.futures
para iniciar tareas paralelas.
Control hacia fuera este ThreadPoolExecutor
ejemplo:
http://docs.python.org/dev/library/concurrent.futures.html#threadpoolexecutor-example
Se genera subprocesos para recuperar HTML y actúa sobre respuestas a medida que se reciben.
import concurrent.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/']
# Retrieve a single page and report the url and contents
def load_url(url, timeout):
conn = urllib.request.urlopen(url, timeout=timeout)
return conn.readall()
# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
# Start the load operations and mark each future with its URL
future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
except Exception as exc:
print('%r generated an exception: %s' % (url, exc))
else:
print('%r page is %d bytes' % (url, len(data)))
El ejemplo anterior utiliza el enhebrado. También hay un parecido ProcessPoolExecutor
que utiliza un conjunto de procesos, en lugar de hilos:
http://docs.python.org/dev/library/concurrent.futures.html#processpoolexecutor-example
import concurrent.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/']
# Retrieve a single page and report the url and contents
def load_url(url, timeout):
conn = urllib.request.urlopen(url, timeout=timeout)
return conn.readall()
# We can use a with statement to ensure threads are cleaned up promptly
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
# Start the load operations and mark each future with its URL
future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
try:
data = future.result()
except Exception as exc:
print('%r generated an exception: %s' % (url, exc))
else:
print('%r page is %d bytes' % (url, len(data)))
Overkill excesivo. Todo lo que necesito son llamadas http simultáneas desde un script (no necesito llamar a un proceso desde la línea de comandos, etc.). Simplemente necesito tener funcionalidad de devolución de llamada, pero no puedo encontrar el proceso para esto en Python. La investigación adicional me está conduciendo hacia urllib2. – kasceled
Overkill? Los hilos no tienen nada que ver con los procesos de llamada desde la línea de comandos. – Falmarri
tippytop, sí, por supuesto, urllib2 para el transporte ... pero aún necesita generarlos en paralelo. para que pueda hacer threading, multiprocesamiento, concurrent.futures o una solución basada en i/o asincrónica. –